@title
とtitle
の違いは何ですか?どちらも変数名にすることができます。また、どのような変数を使うべきかをどうやって決めるのですか? @
とか?
title
はローカル変数です。それらはその範囲内にのみ存在します(現在のブロック)
@title
はインスタンス変数で、クラス内のすべてのメソッドで利用できます。
もっとここで読むことができます: http://strugglingwithruby.blogspot.dk/2010/03/variables.html
Ruby on Railsでは - あなたの変数をインスタンス変数(@title
)としてあなたのコントローラの中で宣言することはそれらをあなたのビューに利用可能にします。
あなたの変数があなたのビューで利用できるようにしたい場合、あなたのコントローラで@title
を使用してください。
説明は、@title
はインスタンス変数、title
はローカル変数で、Railsはコントローラからのインスタンス変数をビューで利用できるようにします。これは、テンプレートコード(erb、hamlなど)が現在のコントローラインスタンスの範囲内で実行されるために発生します。
違いは変数の範囲です。 @versionはクラスインスタンスのすべてのメソッドで利用できます。
簡単に言えば、あなたがコントローラの中にいて、その変数をビューから利用できるようにする必要がある場合は、@variable
を使います。
もっと長い答えについてはこれを試してみてください。 http://www.Ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html
@variable
sはRubyではインスタンス変数と呼ばれています。つまり、クラス内の任意のメソッドでこれらの変数にアクセスできます。 [クラス内のすべてのメソッドにわたって]
@
記号のない変数はローカル変数と呼ばれます。つまり、これらのローカル変数には、その宣言変数内でのみアクセスできます。ローカルスコープに限定されています。
インスタンス変数の例:
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
はクラス内の別のメソッドでアクセスされます。しかし、同じことはローカル変数ではアクセスできません。
ローカル変数は初期化のブロック内からのみアクセス可能です。ローカル変数も小文字(a-z)またはアンダースコア(_)で始まります。
インスタンス変数はself
のインスタンスで、@
で始まります。インスタンス変数もオブジェクト自体に属します。インスタンス変数は.send
などでメソッドを実行するものです。
例:
@user = User.all
@user
はインスタンス変数です
そして、初期化されていないインスタンス変数はNil
の値を持ちます。
変数スコープとは? に関するチュートリアルでは、詳細をよく説明しています。関連するものをここで囲んでください。
+------------------+----------------------+
| Name Begins With | Variable Scope |
+------------------+----------------------+
| $ | A global variable |
| @ | An instance variable |
| [a-z] or _ | A local variable |
| [A-Z] | A constant |
| @@ | A class variable |
+------------------+----------------------+
@変数はローカル変数ではなく、インスタンス変数です。
詳しくは http://Ruby.about.com/od/variables/a/Instance-Variables.htm をご覧ください。