我正在解决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
答案 0 :(得分:6)
能够传递它们并将它们存储在数据结构中是一件可以立即想到的事情。我在一个小命令行解析器中使用后一种情况不太长:使用正则表达式解析用户输入并使用解析后的字符串的其余部分作为参数调用commands[command]
。当然,您可以使用方法send
执行相同的操作,但恕我直言,命令哈希更好。我有时使用的另一件事 - 即使它在Ruby中并不常见 - 是curry个过程,你无法用方法做到这一点:
>> 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