如果我在Ruby中声明@var
,那么该类的每个对象都有自己的@var
。
但如果我想念@
怎么办?我的意思是,我声明了一个名为var2
而没有@
的变量。他们共享变量还是暂时创建的?
答案 0 :(得分: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
的本地变量或方法,但找不到一个,因为zing
中的initialize
早已消失。
答案 1 :(得分: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
答案 2 :(得分:0)
它将成为属于本地词法范围的局部变量。
实施例
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
答案 3 :(得分:0)
如果使用名为var2
的变量,则它是本地的,并且仅在声明它的构造中的范围内。那就是:
class Foo bar = 2 end Foo.new NameError: undefined local variable or method 'bar'