I was solving some problems on Project Euler and I mentioned that I always wrap short methods in proc functions. I asked myself "Why?". The answer was "I don't know. Maybe because it is short?".
So what are the advantages of proc functions to ordinary methods except that they are short :)
# 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)
!((numbe开发者_如何学编程r%2 == 0) || (3..Math.sqrt(number).to_i).step(2).any?{|n| (number%n).zero?})
end
Being able to pass them around and to store them in data structures is something that immediately comes to mind. I used the latter case not too long in a small command line parser: parse user input with a regex and call commands[command]
with the rest of the parsed string as arguments. Sure, you could do the same with methods and send
, but IMHO the commands hash is nicer. Another thing I sometimes use — even though it's not really common in Ruby — is to curry procs, which you can't really do with a method:
>> multiplier = proc { |x, y| x * y }
=> #<Proc:0x00000100a158f0@(irb):1>
>> times_two = multiplier.curry[2]
=> #<Proc:0x00000100a089c0>
>> times_two[5]
=> 10
EDIT: Here's another example (simplified, no error handling):
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
精彩评论