如果我@var在 Ruby 中声明,该类的每个对象都会有自己的@var.
但如果我错过了@怎么办?我的意思是,我声明了一个名为var2without的变量@。他们是共享变量还是临时创建的?
如果我@var在 Ruby 中声明,该类的每个对象都会有自己的@var.
但如果我错过了@怎么办?我的意思是,我声明了一个名为var2without的变量@。他们是共享变量还是临时创建的?
@当它所在的方法完成运行时,如果没有它,它就会被丢弃。
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早已不复存在。
当变量声明时没有范围前缀(@-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
它将成为属于局部词法范围的局部变量。
前任。
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
如果您使用一个名为var2它的变量,它是本地的,并且仅在声明它的构造的范围内。那是:
class Foo bar = 2 end Foo.new NameError: undefined local variable or method 'bar'