Ruby变量的可见性

One*_*ero 4 ruby

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

但如果我想念@怎么办?我的意思是,我宣布一个名为var2without 的变量@.他们共享变量还是暂时创建的?

Ale*_*yne 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>
Run Code Online (Sandbox Code Playgroud)

这表明实例变量@bing与该实例一起保存.它的值可以在该实例的任何方法中访问.

但是局部变量zing不会被持久化(在大多数情况下),并且一旦该方法完成运行,任何局部变量都将被丢弃,并且不再可访问.当get_zing运行时,它会寻找一个局部变量或方法命名zing,并没有找到一个,因为zinginitialize早已不复存在.


Hau*_*eth 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
Run Code Online (Sandbox Code Playgroud)