2012-04-23 46 views
11

現在考慮下面的示例Ruby類正常變量與Ruby中的實例變量,有什麼區別?

class User 
    def hello 
    puts "hello" 
    end 
end 

,進行初始化。有兩種方法

正常可變

1.9.3p125 > tr = User.new 
=> #<User:0x98778c4> 
1.9.3p125 > tr.hello 
Hello world 
=> nil` 

實例變量:

1.9.3p125 > @tr = User.new 
=> #<User:0x9890f2c> 
1.9.3p125 > @tr.hello 
Hello world 
=> nil 

現在,它的工作原理相同的兩種情況。那麼正常變量和實例變量有什麼區別?

回答

29

一正常變量僅在當前上下文中具有作用域;一個實例變量在一個類的一個實例中具有範圍。在你的情況下,他們很困惑,因爲上下文是main,它充當Object的實例。

考慮以下,這可能會使事情更清晰

class User 
    def set_name 
    @name = "Bob" 
    surname = "Cratchett" 
    end 

    def hi 
    puts "Hello, " + @name 
    end 

    def hello 
    puts "Hello, Mr " + surname 
    end 
end 

irb(main):022:0> u = User.new 
=> #<User:0x29cbfb0> 
irb(main):023:0> u.set_name 
irb(main):024:0> u.hi 
Hello, Bob 
=> nil 
irb(main):025:0> u.hello 
NameError: undefined local variable or method `surname' for #<User:0x29cbfb0 @name="Bob"> 
2

局部變量只能在其被定義的方法(或,當變量在頂部級別定義,僅外部的任何方法的)一起使用。實例變量可以從在同一實例上調用的任何方法使用。

下面是一個例子,其中可以看到的差別:

@tr = User.new 

def foo 
    @tr.hello 
end 

foo 
# Hello World 


tr = User.new 

def bar 
    tr.hello 
end 

bar 
# Exception because tr is not accessible from within bar 
4

正常變量稱爲局部變量和是本地的,其中它被定義的代碼構建體(如果在定義它方法,它不能在該方法之外訪問)。

一個實例變量是本地的一個對象的一個​​特定實例。如果一個對象更改實例變量的值,則只會更改該對象。

也有類變量本地的類的所有實例:

@@class_variable = 'a class variable'

而且全局變量隨時隨地訪問該程序中:

$global_variable = 'a global variable'