3

私はProject Eulerでいくつかの問題を解決していましたが、私は常に短いメソッドを proc 関数でラップしていると言いました。「なぜ? 」と自問自答しました。答えは「わからない。短いからかな?」。

したがって、短いことを除いて、通常のメソッドに対するproc関数の利点は何ですか:)

# Proc
is_prime = proc{|number| !((number%2 == 0) || (3..Math.sqrt(number).to_i).step(2).any?{|n| (number%n).zero?})}

# Ordinary method
def is_prime(number)
  !((number%2 == 0) || (3..Math.sqrt(number).to_i).step(2).any?{|n| (number%n).zero?})
end
4

1 に答える 1

6

それらを渡したり、データ構造に格納したりできることは、すぐに頭に浮かぶものです。私は小さなコマンド ライン パーサーであまり長くない後者のケースを使用しました。ユーザー入力を正規表現でcommands[command]解析し、解析された文字列の残りを引数として呼び出します。確かに、メソッドと で同じことを行うことができますがsend、私見ではコマンド ハッシュの方が優れています。Ruby ではあまり一般的ではありませんが、私がときどき使用するもう 1 つのことは、プロシージャーをカリー化することです。これは、メソッドでは実際には実行できません。

>> multiplier = proc { |x, y| x * y }
=> #<Proc:0x00000100a158f0@(irb):1>
>> times_two = multiplier.curry[2]
=> #<Proc:0x00000100a089c0>
>> times_two[5]
=> 10

編集: これは別の例です (単純化され、エラー処理はありません):

 commands = { :double => proc { |x| x * 2 }, :half => proc { |x| x / 2 } }
 run_command = proc do 
     command, arg = STDIN.gets.split 
     commands[command.intern][arg.to_i]
 end
 run_command.call
 half 10
 # => 5
 run_command[]
 double 5
 # => 10
于 2011-08-18T11:26:43.693 に答える