2

このhereブロックの最後に、

entries.map do |key_val|
  "[#{key_val.first}] \"#{key_val.last}\""
end.sort.join("\n")

sortタックされているのがわかりますend。これは一般的ですか?それは何をしているのですか?endの値として扱われるのを見たことがありませんreturn。それが起こっていることですか?メソッドのmap内部は配列を返し、end?で取得できます。

4

3 に答える 3

6

構文に惑わされないでください。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番目のメソッドを呼び出すだけです。{}

于 2013-10-23T01:59:03.367 に答える
1

ruby では、ブロックを含め、すべてが値を返します。と同じ:

intermediate_array = entries.map do |key_val|
  "[#{key_val.first}] \"#{key_val.last}\""
end
intermediate_array.sort.join("\n")

私は上記の構文の選択を好みますが、どちらもインタープリターにとって完全に有効です。

于 2013-10-23T01:54:42.657 に答える
0

「終了」時にメソッドを呼び出すことは一般的ではないと思います。Ruby を学び始めて約 2 か月になりますが、その構文に出くわしたことは一度もありません。

于 2013-10-23T02:52:59.107 に答える