Ruby变量的可见性

时间:2013-02-27 22:36:30

标签: ruby

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

但如果我想念@怎么办?我的意思是,我声明了一个名为var2而没有@的变量。他们共享变量还是暂时创建的?

4 个答案:

答案 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的变量,则它是本地的,并且仅在声明它的构造中的范围内。那就是:

  • 如果您在方法中声明它,那么它将是该方法的本地。
  • 如果您尝试在类定义中声明但在任何方法之外,它将引发NameError。例如:
class Foo
  bar = 2    
end

Foo.new

NameError: undefined local variable or method 'bar'