4

如果我@var在 Ruby 中声明,该类的每个对象都会有自己的@var.

但如果我错过了@怎么办?我的意思是,我声明了一个名为var2without的变量@。他们是共享变量还是临时创建的?

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,它会查找名为的局部变量或方法zing,但找不到,因为zingfrominitialize早已不复存在。

于 2013-02-27T22:45:01.913 回答
5

当变量声明时没有范围前缀(@-instance、@@-class 或$-global),则声明当前范围,即:

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 回答