2014-01-08 35 views
1

我正在第一次學習Ruby,並且發現在使用組合比較運算符(或太空船運算符)時,在運算符前放置的語句將運行,但之後放置的語句會導致錯誤。我用分號玩弄了這個。爲什麼組合比較失敗時,在塊語句中放置了一些東西?

list.sort { |item1, item2| puts "foo"; item1 <=> item2 }的作品,但

list.sort { |item1, item2| item1 <=> item2; puts "foo" }失敗。

我試圖在塊語句之外,這個問題消失了。然後我嘗試了多行塊語句,如

list.sort do |item1, item2| 
    item1 <=> item2 
    puts "foo" 
end 

並且它與單行塊有相同的問題。

有誰知道發生了什麼事?

我想到的最好的解釋是,< =>使用類似splat的參數功能,並在第2項之後的文本中吸吮,但我不知道爲什麼它會在塊聲明中發生,但不在或者爲什麼它忽略了分號和換行符。粗略的搜索沒有發現任何有用的文檔。

編輯:我使用Codeacadamy.com的編譯器時得到的錯誤是「字符串與字符串比較失敗。」

EDIT2:

ruby -e ' 
> list = ["one", "two", "three"] 
> list.sort { |f, s| f <=> s; puts "foo" } 
> puts list 
> ' 
foo 
-e:3:in `sort': comparison of String with String failed (ArgumentError) 
from -e:3:in `<main>' 
+0

你有什麼錯誤?正如你所說的那樣失敗..我們需要看看你的樣本數據。 –

回答

2

當你這樣做:

list.sort do |item1, item2| 
    item1 <=> item2 
    puts "foo" 
end 

紅寶石着眼於返回值的塊來確定比較。由於在塊的末尾有puts "foo",因此自定義比較的結果將是puts "foo"(即nil)的輸出。你希望比較器是你在塊中做的最後一件事。

+0

謝謝。如果沒有返回語句,我忘記了ruby返回最後一個評估表達式。 –