3

私は次のことを表現するためにある種の速記を使用したいと思います:

stuff.map {|x| puts x}

このようなものに:

stuff.map {puts}

構文がわかりません。誰かがこれを行う方法を教えてもらえますか?

4

6 に答える 6

6

まずmap、マッピング操作を行っていないため、ここで使用するのは意味がありませんが、単純な副作用の反復です。それがまさにそのeach目的です。使用するmapことは、将来のメンテナ(あなた自身を含む)にとって混乱を招くだけです。

eachそしてmapブロックを取ります。単項プレフィックス&演算子を使用して、応答するオブジェクトをto_procブロックに変換できます。ありがたいことに、Methodsに応答するto_procので、呼び出したいメソッドを直接渡すことができます。

stuff.each(&method(:puts))

ただし、がの場合stuffArray、さらに簡単な方法があります。これは、puts特殊なケースArrayで、実行していることを正確に実行できるためです。したがって、コードは100%同等です

puts stuff
于 2013-01-07T02:03:46.030 に答える
4

あなたは配列を持っているので、あなたはただ書くことができます

puts stuff

ただし、一般に、文字列またはオブジェクトにメソッドを追加して、直接渡すことができます。メソッドがあるEnumerable.ので、ブロックを必要とせずにそのメソッドを呼び出すことができます。Symbolto_proc

class Object; def myputs; puts self; nil; end; end

stuff.each &:myputs # or, even better, ...

stuff.myputs
于 2013-01-06T18:48:31.260 に答える
3

map(&:method)構文を暗示しているかもしれませんが、 puts'の場合は不可能です。

内部的には、Rubyはto_procシンボルを呼び出します。このメソッドの本体は次のとおりです。

def to_proc
  proc { |obj, *args| obj.send(self, *args) }
end

あなたの場合、objはstuffであり、selfはputsです。

ご存知stuffのように、メソッドに応答しないためputs、現在の式でシンボル構造を使用することはできません。

于 2013-01-06T18:47:36.580 に答える
2

あなたは受信機が必要です

Array#mapのブロック形式は配列を返すため、各要素を標準出力に送信するには、レシーバー( Kernel#putsを使用するKernelなど)が必要です。あなたはこのようなことをすることができます:

puts [1, 2, 3].map(&:to_s)

しかし、それは確かに物事を短くしたり、より明確にしたりするものではありません。おそらく、あなたは本当に達成しようとしていることが何であるかを再考する必要があります。

于 2013-01-06T18:45:15.767 に答える
2

すでに閉鎖されていますが、私は提案します:

stuff.map(&Kernel.method(:puts))
于 2013-01-06T18:55:26.420 に答える
0

ドキュメントによると:

a.map(& puts)

列挙子を返します。次のようなこともできます。

puts a.map(&:to_s)

各要素を印刷します。

于 2013-01-06T18:44:58.983 に答える