如果我@var
在 Ruby 中声明,该类的每个对象都会有自己的@var
.
但如果我错过了@
怎么办?我的意思是,我声明了一个名为var2
without的变量@
。他们是共享变量还是临时创建的?
如果我@var
在 Ruby 中声明,该类的每个对象都会有自己的@var
.
但如果我错过了@
怎么办?我的意思是,我声明了一个名为var2
without的变量@
。他们是共享变量还是临时创建的?
@
当它所在的方法完成运行时,如果没有它,它就会被丢弃。
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
,但找不到,因为zing
frominitialize
早已不复存在。
当变量声明时没有范围前缀(@
-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'