2012-01-23 4 views
3

チュートリアルBastards Book of Rubyを実行していますが、機能の理解に問題があります。sort_byここでは、運動です:Rubyでsort_by関数がどのように機能するかを理解しよう

演習:「姓」の形式で名前を表す文字列の配列、使用sort_byと最後の名前でソートされた配列を返すように分割を考えると姓で並べ替え名

。簡潔にするために、各名前はスペースで区切られた2つの単語(すなわち、「John Doe」のみであり、「Mary Jo Doe」ではない)から構成されているとします。

names = ["John Smith", "Dan Boone", "Jennifer Jane", "Charles Lindy", "Jennifer Eight", "Rob Roy"] 

そしてここソリューションです:

names = ["John Smith", "Dan Boone", "Jennifer Jane", "Charles Lindy", "Jennifer Eight", "Rob Roy"] 
sorted_names = names.sort_by do |name| 
    name.split(" ").reverse.join.upcase 
end 

puts sorted_names.join('; ') 
# output=> Dan Boone; Jennifer Eight; Jennifer Jane; Charles Lindy; Rob Roy; John Smith 

が、私はコード

sorted_names = names.sort_by do |name| 
    puts name.split(" ").reverse.join.upcase 
end 

を実行したときに、私は出力を得る、しかし:

SMITHJOHN 
BOONEDAN 
JANEJENNIFER 
LINDYCHARLES 
EIGHTJENNIFER 
ROYROB 

ましたputs sorted_names.join('; ')

実際にデータを操作して(したがってname.split(" ").reverse.join.upcase)、それを新しい配列sorted_namesに保存していると思っていました。しかし明らかにそうではありません。だから、私の質問は誰かがなぜこのsort_byメソッドがこのように動作しているのか説明してください。私はRubyには比較的新しいので、説明のためにRuby docsを調べてみましたが、見つけられませんでした。私はRubyの重要な概念を理解していないと感じ、助けや洞察力を感謝します。

答えて

4

sort_byは、種類のこれを行うようなものですキーは元の値にマップされます。

あなたが見ているのは、それらのキーがソートされる前です。 ranksrejoinedが付いている点を除いて、putsはnilを返すので、関数を壊したキーを調べることで!

+0

理にかなっていること。私は当初、大文字の名前を期待して新しい配列の出力に驚いていましたが、今度は 'sort_by'メソッドはキーが最終的にソートされることを知っているので意味があります。洞察に感謝します – Abundnce10

4

#sort_byは、値を並べ替えることを期待しています。 putsがある場合は、returnにする必要があります。#sort_byは各要素に対してnilを返すため、並べ替えが行われません。 、sort_byブロックは、アレイ内の各値のソート・キーを計算するために使用され、それらのキーはソートされ

a.map {|item| [f(item), item]}.sort.map {|key, item| item} 

、及びそれら:

0

わからない、これは、この場合に役立ちますが、tapは、制御の流れを乱すことなく、物事にチャンスをうかがっに便利です:

sorted_names = names.sort_by do |name| 
    name.split(" ").reverse.join.upcase.tap { |str| puts str } 
end 
関連する問題