ruby中类的局部变量

时间:2016-01-22 13:55:10

标签: ruby

我注意到以下代码在语法上是正确的:

class Foo
  bar = 3
end

现在,我知道实例变量由@访问,类变量由@@访问,但我无法弄清楚在这种情况下bar存储在哪里或如何访问它。

如何找到bar的范围?

4 个答案:

答案 0 :(得分:7)

Ruby中类的主体只是可执行的Ruby代码。这些确实是局部变量(不需要引用),并遵循“常规”规则作为局部变量。您可以在课程正文中访问它们。如果您确实希望定义bar的范围,则可以使用Kernel.binding

class Foo
  bar = 42

  @@scope = binding

  def self.scope
    @@scope
  end  
end 

Foo.scope.local_variables          # => [:bar]
Foo.scope.local_variable_get(:bar) # => 42

需要注意的事项 - 使用def更改范围,因此,在使用def定义的方法中,它们将不可见。

答案 1 :(得分:4)

可以从同一个班级机构访问。

class Foo
  bar = 3
  bar # => 3
end

它是词法范围的,因此可以在一个块内访问:

class Foo
  bar = 3
  pr = ->{p bar}
  pr.call # => 3
end

但是一旦关闭了班级主体,即使在同一个班级也无法访问它:

class Foo
  bar = 3
end
class Foo
  bar # => error 
end

也无法从方法定义中访问:

class Foo
  bar = 3
  def baz; bar end
  new.baz # => error
end

答案 2 :(得分:2)

在关闭类的定义之前,可以访问bar变量。在您定义的方法中无法访问它。

您可以尝试在irb:

中运行代码
$ irb
irb(main):001:0> class Test
irb(main):002:1> bar = 1
irb(main):003:1> puts bar
irb(main):004:1> end
1
=> nil
irb(main):005:0> puts bar
NameError: undefined local variable or method `bar' for main:Object
        from (irb):5
        from /usr/bin/irb:11:in `<main>'
irb(main):006:0> class Test
irb(main):007:1> puts bar
irb(main):008:1> end
NameError: undefined local variable or method `bar' for Test:Class
        from (irb):7:in `<class:Test>'
        from (irb):6
        from /usr/bin/irb:11:in `<main>'
irb(main):009:0> 

检查实例方法中的可用性:

irb(main):018:0> class Test
irb(main):019:1> bar = 1
irb(main):020:1> def test
irb(main):021:2> puts bar
irb(main):022:2> end
irb(main):023:1> end
=> :test
irb(main):024:0> a = Test.new
=> #<Test:0x00000000f447a0>
irb(main):025:0> a.test
NameError: undefined local variable or method `bar' for #<Test:0x00000000f447a0>
        from (irb):21:in `test'
        from (irb):25
        from /usr/bin/irb:11:in `<main>'

检查班级方法的可用性:

irb(main):026:0> class Test
irb(main):027:1> bar = 1
irb(main):028:1> def self.test
irb(main):029:2> puts bar
irb(main):030:2> end
irb(main):031:1> end
=> :test
irb(main):032:0> Test.test
NameError: undefined local variable or method `bar' for Test:Class
        from (irb):29:in `test'
        from (irb):32
        from /usr/bin/irb:11:in `<main>'

答案 3 :(得分:0)

你可以使它成为常量并使用它的实例和类方法:

class Foo
    Bar = 3

    def local_bar(param = Bar)
        param
    end
end

p Foo.new.local_bar
#=> 3