このhereブロックの最後に、
entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end.sort.join("\n")
にsort
タックされているのがわかりますend
。これは一般的ですか?それは何をしているのですか?end
の値として扱われるのを見たことがありませんreturn
。それが起こっていることですか?メソッドのmap
内部は配列を返し、end
?で取得できます。
このhereブロックの最後に、
entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end.sort.join("\n")
にsort
タックされているのがわかりますend
。これは一般的ですか?それは何をしているのですか?end
の値として扱われるのを見たことがありませんreturn
。それが起こっていることですか?メソッドのmap
内部は配列を返し、end
?で取得できます。
構文に惑わされないでください。do
...で定義されたブロックは、呼び出しend
に渡される特別なタイプの引数です。map
括弧に入っていないか、引数のように見えますが、引数の 1 つです。メソッド呼び出しの構文は、end
. .
したがって、 にメソッドを貼り付けると、呼び出しend
の戻り値でそのメソッドを呼び出すことになります。map
これは、できれば配列です。
Ruby の奇妙な構文に慣れていない人にもわかりやすいように、さまざまな書き方があります。たとえば、@AndrewMarshall で提案されているように、優先順位を明示的にするためにいくつかの括弧を追加します。
(entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end).sort.join("\n")
または、ブロックから Proc を作成し、 を使用してメソッド呼び出しの括弧内に渡します&
。これにより、チェーンされたメソッド呼び出しが構文的により馴染みのある場所になります (これでは、ブロック自体も、よりクリーンなスタイルと思われる方法で書き直しました)。
block = proc do |key, val|
%([#{key}] "#{val}")
end
entries.map(&block).sort.join("\n")
AJcodezの回答のように、それをチェーンのレベルを削除することと組み合わせることができます:
intermediate_array = entries.map(&block)
intermediate_array.sort.join("\n")
または、チェーンを完全に削除します。
mapped = entries.map(&block)
sorted = mapped.sort
joined = sorted.join("\n")
return joined
基本的に、メソッド呼び出し構文が に付加されているという事実は、Ruby のブロック渡し構文の癖にすぎません (もちろん、メソッド呼び出しを...ブロックend
の閉じ中括弧に付加しても機能します)。メソッドを呼び出して(たまたまブロックを受け取ります)、最初のメソッドの戻り値で2番目のメソッドを呼び出すだけです。{
}
ruby では、ブロックを含め、すべてが値を返します。と同じ:
intermediate_array = entries.map do |key_val|
"[#{key_val.first}] \"#{key_val.last}\""
end
intermediate_array.sort.join("\n")
私は上記の構文の選択を好みますが、どちらもインタープリターにとって完全に有効です。
「終了」時にメソッドを呼び出すことは一般的ではないと思います。Ruby を学び始めて約 2 か月になりますが、その構文に出くわしたことは一度もありません。