Ruby on Railsの@変数


294

違いは何だ@titleとはtitle?どちらも変数名にすることができるので。また、どの種類の変数を使用する必要があるかをどのように決定しますか?との@かどうか?


:私はこのチュートリアルでは、これらすべてを説明するのは非常にきれいだと思いtechotopia.com/index.php/...
Hearen

回答:


426

titleローカル変数です。それらはそのスコープ内にのみ存在します(現在のブロック)

@title インスタンス変数であり、クラス内のすべてのメソッドで使用できます。

詳しくはこちらをご覧くださいhttp : //strugglingwithruby.blogspot.dk/2010/03/variables.html

Ruby on Railsの場合-コントローラーで変数をインスタンス変数(@title)として宣言すると、ビューで使用できるようになります。


4
答えてくれてありがとう、フォローアップの質問があります...私が取り組んでいるクラス内では、メンバー変数は最初は@options = {...}のように構築されます。ただし、この後、クラス内のメソッドは、その変数をローカルであるかのようにアクセスして関数呼び出しを行います(つまり、 "options.merge()")。これは悪い形ですか?他に何か構文上の魔法は入っていますか?(つまり、変数のサイレントdupを作成したり、変更できないように「const」にするなど)?私はC / C ++とJavaの観点から来ており、本当に曖昧でオプションの構文が私を混乱させています!
Dan Devine

あなたのクラスには同じ名前@DanDevineで定義されたattr_accessorがありますか?attr_accessorは、getter \ setterを生成する構文糖です。@記号なしで値を取得している場合、ゲッターを呼び出しているため、コードは変数を受け取ります。これは他の方法では機能しないことに注意してください。varを設定する場合は@記号を明示的に使用する必要があります。そうしないと、ローカル変数を設定するだけです。これはいいスタイルですか?言いにくい。ゲッターがオーバーライドされた場合に備えて、メソッドでゲッター構文​​を使用することを好みます。クラス自体の中であっても、そのカプセル化を尊重します。YMMV
Msencenb

30

@title変数をビューで使用できるようにする場合は、コントローラーで使用します。

これは@titleインスタンス変数でtitleあり、ローカル変数であり、railsはコントローラーからのインスタンス変数をビューで使用できるようにします。これは、テンプレートコード(erb、hamlなど)が現在のコントローラーインスタンスのスコープ内で実行されるために発生します。


これをありがとう!これは、コントローラークラスで定義された@variablesがビューのコードで取得できる理由を説明する唯一の回答です。
AlexC 2014

25

違いは変数のスコープです。@versionは、クラスインスタンスのすべてのメソッドで使用できます。

簡単に言えば、コントローラーを使用していて、ビューで変数を使用できるようにする必要がある場合は、を使用します@variable

より長い答えについては、これを試してくださいhttp : //www.ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html


14

@variablesはルビではインスタンス変数と呼ばれます。つまり、クラス内の任意のメソッドでこれらの変数にアクセスできます。[クラスのすべてのメソッドにわたって]

@記号のない変数はローカル変数と呼ばれます。つまり、これらのローカル変数には、その宣言された方法内でのみアクセスできます。ローカルスコープに限定されます。

インスタンス変数の例:

class Customer
  def initialize(id, name, addr)
    @cust_id = id
    @cust_name = name
    @cust_addr = addr
  end

  def display_details
    puts "Customer id #{@cust_id}"
    puts "Customer name #{@cust_name}"
    puts "Customer address #{@cust_addr}"
  end
end

上記の例@cust_idでは@cust_name@cust_addrはクラス内の別のメソッドでアクセスされます。しかし、同じことはローカル変数ではアクセスできません。


9

チュートリアル変数のスコープとは何ですか?いくつかの詳細を非常によく示しています。関連をここで囲んでください。


+------------------+----------------------+
| Name Begins With |    Variable Scope    |
+------------------+----------------------+
| $                | A global variable    |
| @                | An instance variable |
| [a-z] or _       | A local variable     |
| [A-Z]            | A constant           |
| @@               | A class variable     |
+------------------+----------------------+

4

ローカル変数は、その初期化のブロック内からのみアクセスできます。また、ローカル変数は小文字(az)またはアンダースコア(_)で始まります。

また、インスタンス変数はのインスタンスでselfあり、次のもので始まり@ます。また、インスタンス変数はオブジェクト自体に属しています。インスタンス変数は、IE .sendなどでメソッドを実行する変数です

例:

@user = User.all

@userインスタンス変数であります

また、初期化されていないインスタンス変数の値は Nil


では、これは@title&の違いをどのように説明しtitleますか?
Richard Peck

@titleのようなインスタンス変数を使用すると、さまざまなメソッドを実行できますが、ローカル変数では実行できません
Joe Hilton

1
それでは、実際にどのように問題を解決しますか?チュートリアルを引用しているようです。OPは、彼が使用する必要があるかどうかを知りたがっている@titletitle
リチャード・ペック

したがって、メソッドdef newまたはdef createなどを実行する場合は、インスタンス変数を使用する必要があります
Joe Hilton

3
user = User.allを実行してuserでメソッドを実行することを妨げるものは何もありませんが、これは重要ではありません。
Jaro、2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.