4

Ruby で宣言する@varと、そのクラスのすべてのオブジェクトに独自の@var.

しかし、私が逃した場合はどうなり@ますか? var2つまり、 withoutという変数を宣言しています@。彼らは変数を共有していますか、それとも一時的に作成されていますか?

4

4 に答える 4

5

それがないと、@それが含まれているメソッドの実行が完了すると破棄されます。

class Foo
  def initialize
    @bing = 123
    zing  = 456
  end

  def get_bing
    @bing
  end

  def get_zing
    zing
  end
end

foo = Foo.new
foo.get_bing #=> 123
foo.get_zing #=> NameError: undefined local variable or method `zing' for #<Foo:0x10b535258 @bing=123>

これは、インスタンス変数@bingがそのインスタンスとともに保存されていることを示しています。その値は、そのインスタンスの任意のメソッド内でアクセスできます。

ただし、ローカル変数zingは永続化されず(ほとんどの場合)、メソッドの実行が完了するとすぐにローカル変数は破棄され、アクセスできなくなります。を実行するget_zingと、という名前のローカル変数またはメソッドが検索されますが、 fromが長い間使用されzingていないため、検索されません。zinginitialize

于 2013-02-27T22:45:01.913 に答える
5

変数がスコープ プレフィックス ( @- インスタンス、@@- クラス、または$- グローバル) なしで宣言されている場合、現在のスコープに対して宣言されます。つまり、次のようになります。

class Foo
  def boo
    @boo ||= 'some value'
    var ||= 40

    puts "boo: #@boo var: #{var}"
  end

  def foo
    var ||= 50

    puts "boo: #@boo var: #{var}"
  end
end

c = Foo.new
c.boo # => boo: some value var: 40
c.foo # => boo: some value var: 50

def foo
  $var ||= 30

  puts "$var: #$var"
end

foo # => $var: 30

puts "$var: #$var" # => $var: 30

%w[some words].each do |word|
  lol = word # blocks introduce new scope
end

puts lol # => NameError: undefined local variable or method `lol'

for word in %w[some words]
  lol = word # but for loop not
end

puts lol # => words
于 2013-02-27T22:54:09.170 に答える
1

これは、ローカル字句スコープに属するローカル変数になります。

元。

class Foo
  def Bar
    @fooz = 1
  end
  def Barz
    fooz = 2
  end
  def test
    puts @fooz
  end
end

f = Foo.new
f.Bar
f.test
f.Barz
f.test

出力:

1
1 #not 2
于 2013-02-27T22:46:41.877 に答える
0

と呼ばれる変数を使用する場合、var2それはローカルであり、それが宣言されている構造のスコープ内にのみあります。あれは:

  • メソッド内で宣言すると、そのメソッドに対してローカルになります。
  • クラス定義内で宣言しようとすると、メソッドの外で宣言すると、NameError が発生します。例えば:
class Foo
  bar = 2    
end

Foo.new

NameError: undefined local variable or method 'bar'
于 2013-02-27T22:56:37.427 に答える