2013-02-27 81 views
4

如果我在Ruby中聲明@var,那麼該類的每個對象都將擁有自己的@varRuby變量的可見性

但是如果我錯過@?我的意思是,我聲明瞭一個名爲var2而沒有@的變量。他們共享變量還是暫時創建?

+0

你說的意思是 '如果我錯過@'? – boulder 2013-02-27 22:40:34

+0

我的意思是,如果我創建了一個名爲「var2」的變量,而沒有@。 – OneZero 2013-02-27 22:41:13

+0

您不要在Ruby中「聲明」變量... – meagar 2013-06-10 22:46:46

回答

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 
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的本地變量或方法,但找不到一個,因爲initialize中的zing已過時。

0

它將成爲屬於本地詞彙範圍的局部變量。

Ex。

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 
0

如果您使用名爲var2的變量,它是本地的,並且僅在聲明構造的範圍內。即:

  • 如果您在一個方法中聲明它,它將在該方法中是本地的。
  • 如果您嘗試在類定義內但在任何方法外部聲明,則會引發NameError。例如:
class Foo 
    bar = 2  
end 

Foo.new 

NameError: undefined local variable or method 'bar'