2012-07-09 119 views
0
class Item 

    def name=(name_value) 
     @name = name_value 
    end 

    def name 
     @name 
    end 

end 

在第一種情況的制定者名稱和初始化符號「=」:紅寶石。在一個對象

item = Item.new 
item.name=("value") 
puts item.class 

我不斷收到。

Item 

在第二種情況:

item = Item.new.name=("value") 
puts item.class 

String 

爲什麼?我不明白區別。

回答

3

紅寶石看到你的第二個例子作爲賦值運算符的這個

item = Item.new.name = 'value' 

返回值是被分配值。 Item.new.name = 'value'返回'value'以及item = 'value'

class Item 
    def name=(name_value) 
    @name = "processed #{name_value}" 
    end 

    def name 
    @name 
    end 
end 

item = Item.new 
item2 = item.name = "value" # your example code 

item2 # => "value" 
item.name # => "processed value" 
0

對於第二種情況,您正在創建一個新項目並設置該名稱,當您設置該名稱時,它會返回一個字符串,並將其分配給該項目變量。 你應該使用第一種形式

,或者當來自ActiveRecord的繼承:

item = Item.new(:name=>"value") 
1

在Ruby中,賦值表達式求值爲正在分配的值。

即:

foo = 'bar' 

評估爲'bar'

所以,你的情況

Item.new.name=("value") 

這將更多的慣用這樣寫:

Item.new.name = 'value' 

正在分配的值是字符串'value'

所以,Item.new.name = 'value'計算結果爲'value'(與主叫當然name=方法,的副作用),這意味着

item = Item.new.name = 'value' 

評估爲

item = 'value' 

而在最後, item的值爲'value',這是String

+1

我們的答案像雙胞胎:) – 2012-07-09 17:37:05