2013-04-09 37 views
4

有人會關心解釋爲什麼在舊版本的Ruby中,賦值的結果是屬性設置方法返回的值,但在Ruby 1.8之後,賦值的值始終是參數的值;該方法的返回值被丟棄。在下面的代碼中,舊版本的Ruby會將結果設置爲99.現在結果將設置爲2.爲什麼賦值的值始終是參數的值?

class Test 
    def val=(val) 
    @val = val 
    return 99 
    end 
end 

t = Test.new 
result = (t.val = 2) 
result # => 2 

此更改背後的原因是什麼?

回答

2

當您想要將相同的值分配給多個變量時,將分配鏈接在一起並不罕見。這在其他語言中更爲常見。

@user_id = user.id = next_user_id 

但是當你沒有考慮這個問題時會發生什麼,所以返回值與輸入值不一樣?

class User 
    def id=(name) 
    @id = name 
    @modified = true 
    end 

    def modified? 
    @modified 
    end 
end 

此代碼將工作完全正常,直到有一天,當你去放棄它在分配鏈就像上面,當突然間,你會得到意想不到的效果。

因此,解釋器會做某種巫術並確保賦值的RHS是返回值,從而丟棄實際的返回值。

2

作業總是評估爲指定值。這是一個簡單而一致的規則,在之內一致的,以及與大多數其他基於表達式的編程語言一致。

其他一切都將是一個不一致的特殊情況,這些都是不好的。

+2

如果使用'Kernel#send'來調用setter,它將返回實際值。 – 2013-04-09 02:18:18

相關問題