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 中并不常见——是curry procs,你不能用方法真正做到这一点:

>> 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 回答