5
class MainController < ApplicationController

  @my_var = 123
   def index
    var1 = @my_var
   end

   def index2
    var2 = @my_var
   end
end

どちらもと等しくvar1ないのはなぜですか?var2123

4

3 に答える 3

22

の変数@は、rubyのインスタンス変数です。クラス変数を探している場合は、接頭辞としてが付いている@@ため、代わりにを使用する必要があります@@my_var = 123

また、インスタンス変数をそのように使用できない理由は、メソッドの外部でインスタンス変数を定義した場合、それらはメソッドと同じスコープに存在せず、クラスが解釈されている間のみ存在するためです。

var1indexあなたの例ではローカル変数であり、メソッド内でのみ表示されます。

例:

class Foo
  @@class_variable = "I'm a class variable"

  def initialize
    @instance_variable = "I'm an instance variable in a Foo class"
    local_variable = "I won't be visible outside this method"
  end

  def instance_method_returning_an_instance_variable
    @instance_variable
  end

  def instance_method_returning_a_class_variable
    @@class_variable
  end

  def self.class_method_returning_an_instance_variable
    @instance_variable
  end

  def self.class_method_returning_a_class_variable
    @@class_variable
  end
end

Foo.new
=> #<Foo:0x007fc365f1d8c8 @instance_variable="I'm an instance variable in a Foo class">
Foo.new.instance_method_returning_an_instance_variable
=> "I'm an instance variable in a Foo class"
Foo.new.instance_method_returning_a_class_variable
=> "I'm a class variable"
Foo.class_method_returning_an_instance_variable
=> nil
Foo.class_method_returning_a_class_variable
=> "I'm a class variable"
于 2012-07-17T13:32:24.410 に答える
2

@my_varサンプルコードの は、クラス のインスタンス変数ですMainController。つまり、インスタンス レベルのインスタンス変数ではなく、クラス レベルのインスタンス変数です。クラスのインスタンスに関連付けられたインスタンス変数とはまったく異なるスコープに存在します。

インスタンスメソッドの本体内で、クラス のインスタンスであるオブジェクトのインスタンス変数を逆参照しようとしてindexいますが、そのインスタンス変数をどこにも定義していないため、 が返されます。index2MainControllernil

クラス レベルのインスタンス変数として使用@my_varする場合は、次のようにクラスのインスタンス内から値を取得できます。

var1 = self.class.instance_variable_get(:@my_var)

クラス変数は@@接頭辞で示され、その使用が完全に推奨されるわけではありません。その理由は、Google で数分調べればわかります。

于 2012-07-17T14:02:23.107 に答える
0

コードは異なるコンテキストで実行されるためです。ここで見ることができます:

class MainController
  puts self
  def print_self
    puts self
  end
end
#=> MainController
MainController.new.print_self #=> <MainController:0x00000001761140>

最初の印刷でわかるように、自己はです。2番目の印刷では、自己はクラスMainControllerから派生したオブジェクトです。MainController

@my_vay への割り当てでは、この変数は MainController に属し、2 番目のケースでは、@my_var はオブジェクト (クラスではない) に属し、これらの変数は異なります。

于 2012-07-17T13:34:26.603 に答える