2017-02-08 56 views
1

因爲我們知道函數有副作用和/或返回值,而且方法只有副作用。所以對於性能/內存的角度來說,最好在ruby方法結束時返回nil我應該總是返回零紅寶石方法?

例如,如果我有,增加了一個哈希像這樣一個現有的哈希值的方法:

def add_to_config(config) 
    config[:alphabet] = {a: 1, b: 2, c: 3} 
end 

我們知道,這種方法的返回值是分配的項目,在這種情況下,字母哈希值。現在在這個微不足道的例子看起來不是什麼大問題。但是,如果它是一個大型的複雜數據結構,會發生什麼?

明確返回nil以防止更大的數據結構被返回是更好嗎?

def add_to_config(config) 
    config[:alphabet] = {a: 1, b: 2, c: 3} 
    nil 
end 

還是真的很重要?因爲它可能只是把一個指針推入堆棧 - 我猜不知道它是如何使用ruby的。

+2

「所以對於性能/內存的角度來說,最好在ruby方法結束時返回零。」你的理由是什麼? – meagar

+0

從我的舊'c'編程日,我知道返回值被壓入堆棧幀並且調用函數需要彈出它們。我會認爲紅寶石的工作方式類似,如果返回零,所有這些推動和流行將被避免,從而減少內存使用,並減少所需的時鐘週期 –

+1

紅寶石是爲程序員的幸福而設計的,雖然有些時候優化很重要,但這可能不是考慮到返回值將被垃圾收集,除非它被分配給一個變量。但是,當方法僅使用副作用時,記錄文檔很有幫助。有一個約定在方法名稱末尾添加一個bang('!'),有些人確實選擇顯式返回nil,但是爲了清晰起見而不是表現。 –

回答

3

要開始,方法也有返回值與可選的副作用。更進一步的Ruby只有方法,而不是函數。在模塊或類之外定義的一些代碼是默認主對象的方法,它是Object類。

如果只有副作用和沒有返回值,傳統的智慧是返回自我。這樣的方法被鏈接:

obj.method_one(args).method_two(args).method_three(args) 

,而不是:

obj.method_one(args) 
obj.method_two(args) 
obj.method_three(args) 

雖然一個小點,每一個方法總是可以訪問它的自我,而零將是一個特殊的全局對象的引用。這可能會更快,但不夠重要。

上面的源代碼僅供參考,並不打算在源代碼格式上發起聖戰。