【问题标题】:What are the advantages of proc functions to methodsproc函数对方法有什么好处
【发布时间】:2011-08-18 11:14:17
【问题描述】:

我在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

【问题讨论】:

  • 代码打高尔夫球:使用偶数?方法,并检查 upto 是否采用 step 参数。

标签: ruby lambda proc-object


【解决方案1】:

能够传递它们并将它们存储在数据结构中是立即想到的事情。我在一个小型命令行解析器中使用了后一种情况不太长的时间:使用正则表达式解析用户输入并调用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

【讨论】:

  • «例子!例子!»,人们哭了。
  • 你对我的cmets来说太快了!
  • 我添加了一个用于咖喱,您需要/想要另一个吗?
  • 还有一个,请:store them in data structures
  • 哈哈,我又跑得太快了;-)
猜你喜欢
  • 2011-12-09
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2013-04-05
相关资源
最近更新 更多