3

私は主に最上位レベルで Ruby をいじっており、通常は次のようなコードを記述します。

@x = 'foo'
def show_var
  puts @x
end

show_var # => foo

この例がどのように機能するかに基づいて、クラスとオブジェクトの両方でインスタンス変数を使用できると思いました。

今日、私はこれに遭遇しました。インスタンス変数の理解が間違っているようです:

class Test
  @x = "foo" #you would need to define this inside 'initialize' for this to be available to show_var
  def show_var
    puts @x
  end 
end

Test.new.show_var # => nil

2 番目の例は、インスタンス変数がどのように機能するかのようです。クラス内でインスタンス変数を定義すると、その変数はそのスコープ内にのみ存在し、インスタンス メソッドには存在しません。

次に、私の質問は...変数 @x がインスタンスメソッドのスコープ内に存在してはならないときに、最初のケースが「foo」を出力するのはなぜですか? また、トップレベルのメソッドに使用したいトップレベルのクラスで変数を定義する適切な方法は何ですか?

4

2 に答える 2

5

最初の例のメソッドは最上位にあります。これは、特別な最上位オブジェクトに属していることを意味しますmain。のコピーをさらに作成することは実際にはできないmainためself、そのメソッドの内側と外側は同じです。これをチェックしてください:

self # => main
def show_var
  self # => main
end

class Test
  self # => Test
  def show_var
    self # => #<Test:0x007fdf9c892d70>
  end 
end
于 2013-07-27T19:58:26.750 に答える
1

以下を見てください:

@x = 'foo'
def show_var
  puts @x,self
  p defined? @x
end

show_var
# >> foo
# >> main
# >> "instance-variable"

最初のケース@xでは、mainスコープで定義しました。そしてshow_var、からメソッドを呼び出すと、他の場合とはmain異なり、の出力が得られます@x

class Test
  @x = "foo" 
  def show_var
    p @x,self 
    p defined? @x
  end 
end

Test.new.show_var
# >> nil
# >> #<Test:0x9b6fcd4>
# >> nil
于 2013-07-27T19:58:40.660 に答える