2016-01-22 106 views
5

我注意到下面的代碼局部變量語法正確:在紅寶石一類

class Foo 
    bar = 3 
end 

現在,我知道,實例變量被@訪問,並通過@@類變量,但我不能找出bar存儲在這種情況下或如何訪問它。

我怎樣才能找到bar的範圍?

+2

這是一個局部變量,就像任何其他局部變量。 –

回答

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定義可見裏面的方法。

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>' 
+0

有沒有辦法「保存」這些聲明?一種將它們傳播到方法或其他東西的方法? –

+0

@GiladNaaman:不會的。因此,名稱_local_變量。 :) –

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 
0

你可以把一個常數,並用它實例和類方法:

class Foo 
    Bar = 3 

    def local_bar(param = Bar) 
     param 
    end 
end 

p Foo.new.local_bar 
#=> 3