如果我@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>
Run Code Online (Sandbox Code Playgroud)
这表明实例变量@bing
与该实例一起保存.它的值可以在该实例的任何方法中访问.
但是局部变量zing
不会被持久化(在大多数情况下),并且一旦该方法完成运行,任何局部变量都将被丢弃,并且不再可访问.当get_zing
运行时,它会寻找一个局部变量或方法命名zing
,并没有找到一个,因为zing
从initialize
早已不复存在.
当声明变量没有作用域前缀(@
- 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
Run Code Online (Sandbox Code Playgroud)