0

Objectブロックを受け取り、レシーバーをブロックに適用するメソッドを定義したいと考えています。実装は次のようになります。

class Object
    def apply ≺ pr.call(self) end
end

2.apply{|x| x * 3} # => 6

これを行うための標準的な方法や、同様の使用方法を持つよく知られたライブラリは既にありますか? もしそうなら、私は車輪を再発明したくありませんでした.

オプションのブロックを受け取るメソッドがあり、ブロックがない場合return_valueはメソッド内で計算されたものを返したいのですが、ブロックがある場合はの戻り値を返したいということがよくあります。ブロックにreturn_value適用されます。今のところ、次のような行がたくさんあります。

def method ..., &pr
  ...
  pr ? pr.call(return_value) : return_value
end

しかし、私は一貫して書きたい

def method ..., &pr
  ...
  pr ? return_value.apply(&pr) : return_value
end

またはさらに良いことに、 の定義をわずかに変更するとapply

def method ..., &pr
  ...
  return_value.apply(&pr)
end
4

3 に答える 3

3

Object.tapはあなたが探しているものだと思います:

"Abc".tap do |str|
  puts str
end
于 2012-03-06T20:17:34.047 に答える
1

それは と同一ではありませんdef apply; yield self; endか? – スティーンスラグ

@steenslag はい。です。selfレシーバーとしてその効果を出したい。– さわ

これはあなたが意味するものですか?

2.instance_eval { * 3 }
# => 6

残念ながら、それはうまくいきません。instance_eval受信者が であるかのようにコードを実行するだけですself。オペレーターはself受信者として想定しないため、実際には次のように記述する必要があります。

2.instance_eval { self * 3 }
# => 6

ただし、概念実証として、これは可能です。

Numeric.send(:define_method, :plus) { |x| self + x }
2.instance_eval { plus 3 }
# => 5
于 2012-03-06T22:02:10.303 に答える
0

(OPの編集を読んだ後)知る限り、これを書く標準的な方法は次のとおりです。

def purpose(*args)  #no &bl or &pr
  res = 42 #huge calculation
  return res unless block_given?
  yield res
end

p purpose(1,2)
purpose{|n| puts "from the block: #{n}"}
于 2012-03-06T22:16:13.603 に答える