2014-10-17 69 views
1

這裏的代碼鎬頭書的一個片段:所有方法都必須返回一個有意義的值嗎?

def count_frequency(word_list) counts = Hash.new(0) 
    for word in word_list 
    counts[word] += 1 
    end 
    counts 
end 

counts末設置方法的返回值。返回的值是最後一次計算的值。

但是,有沒有我們不關心方法的返回值是什麼的情況?例如,我有一對嵌套的each循環將棋盤畫到控制檯。計算值在方法外是相當無意義的。我只想繪製一個棋盤。

將返回值留給情況還是應該總是試圖顯式設計返回有意義值的方法?

回答

3

如果該方法沒有像某些期望值那樣使用,則不必關心返回值。完全不用擔心。

但是,對於您的counts示例,返回該值是該方法的全部要點。如果該方法沒有返回該值,那麼它是沒有意義的,最後你肯定需要這個counts

在某些情況下,返回值不是該方法的主要目的,但仍想返回某個值。一個這樣的情況是當該方法旨在在一個jQuery式的方法鏈中使用這樣的:

some_object.do_this(args).do_that(args).then_do_this 

在這種情況下,您返回接收器是很重要的。這發生在某些圖書館或框架中,但除非您特意將其用於此目的,否則您不一定非得這樣做。

+0

如有疑問,請返回'self'。 – Max 2014-10-17 14:24:22

1

在Ruby號,每個表達式返回一個值,即使它僅僅是nil。不只是方法;你寫的每一行。在方法的情況下,返回值是退出之前評估的最後一個值。這個價值的意義取決於你。如果你記錄該方法沒有返回值,那麼即使它返回一個值也是未定義的;不是API的一部分,調用者明智地不會使用它。

例如,如果您記錄它,即使nil也可以具有適當的含義;它通常用於表示找不到資源。但是,如果一個方法的唯一目的是執行像寫入文件一樣的副作用,那麼它可能是沒有實際意義的東西; puts返回nil.

1

不,返回值是沒有必要的,當方法不應該返回一個有意義的值,就像大多數其他編程語言一樣。

實際上,最常見的方法之一puts返回nil

#puts "hello" 
hello 
=> nil 
1

理論上,如果你清晰記錄返回值是沒有意義的,那麼你可能只是偶然返回無論在方法的最後一個表達式發生,以評估。

實際上,然而,沒有人讀的文件,所以,如果你的方法回報的東西,那麼人就會依賴於它。另外,根據你確實是「意外」返回的內容,你可能會泄漏你的方法的私有內部實現細節,或者甚至可能會破壞你的對象的封裝。返回一個私有實例變量的值。例如,

defined?一元前綴運算符爲例。它被指定爲返回一個真實或虛假的值。然而,在MRI上,它不僅返回任何真實值,而且實際上返回描述被詢問的表達的類型的String(例如'local-variable','method'等)並且人們已經變得如此依賴於所有其他返回值Ruby實現來模仿它,即使它沒有記錄。現在,事實證明,對於MRI而言,這些信息是平常可用的,但對於JRuby而言,並非如此,並且保留這​​些信息會導致性能損失。 E編程語言是一種純粹基於表達式的語言,如Ruby或Lisp。一切都是表達,沒有任何陳述。一切都會返回一個值。但是,與其他語言不同,子例程的隱式返回值不是在子例程內求值的最後一個表達式的值,它是nil。你需要必須明確return如果你想返回一個有意義的值。這是因爲E的創造者認爲,意外返回你不想要的東西太危險。 (E明確爲安全,安全,完整性和可靠性而設計。)

+0

考慮到Ruby的含糖特性,理論與實踐之間的突破是一個特別重要的觀點。無論出於何種原因,我一直對隱性回報感到困擾,你引用的原因正是其原因。 Vielen Dank。 Gruesse aus Kalifornien。 – MarsAtomic 2014-10-17 19:02:09

相關問題