【问题标题】:Trying to understand procs in Ruby with 'square then double' example尝试通过“square then double”示例来理解 Ruby 中的 procs
【发布时间】:2014-03-28 22:50:43
【问题描述】:

我试图理解为什么这段代码有效。具体来说,

1.compose的方法定义中,为什么要新建一个Proc?为什么不创建新的proc就不能调用proc2和proc1?

2.我尝试创建函数'double_then_square',但它只能作为一个任务。是不是因为方法中不能有方法?递归不是一个反例吗,或者是你不能在方法中拥有不同方法的规则?

def compose(proc1, proc2)
    Proc.new do |x|
        proc2.call(proc1.call(x))
    end
end

square_it = Proc.new do |n|
    n ** 2
end

double_it = Proc.new do |n|
    n * 2
end


double_then_square = compose(double_it,square_it)
puts double_then_square.call(1)

【问题讨论】:

  • 如果您描述了如何尝试创建您所说的 double_then_square 函数,将会有所帮助。另外,请尝试扩展一下您认为递归与此相关的方式。
  • 另外,还有一个问题:您为什么要特别使用 ruby​​ 来学习这些概念? Ruby 在函数式编程模式(块、方法、过程、lambda 及其微小差异)方面有点古怪,因为它是一种强大的 OO 语言。 Python 或 javascript 可能是更好的选择
  • 我之前的问题得到了解答。我只使用 Ruby,因为那是我一直遵循的指南。您认为有必要切换语言来理解这些概念吗?
  • 不,完全没有,ruby 确实有它们。只是它不那么容易适应他们,你会不断地遇到本质上的 OO。 Python、Javascript 和 Ruby 都是多范式,但 Python 和 Javascript 更偏向 FP,而 Ruby 更偏向 OOP。

标签: ruby proc


【解决方案1】:
  1. 因为它会在你定义 double_then_square 时立即执行,显然不可能,因为我们还不知道 1 正在传入。相反,你想要一些你可以打电话的东西,例如,发送.call(1) on。也就是说,我们要返回一个Proc

  2. 不,应该可行。但是,您将无法访问本地变量,因此您必须在方法中定义它们。由于它是正确的方法,因此您也将直接调用它而不是使用.call。下面的代码对我有用。


def double_then_square(*args)
  square_it = Proc.new do |n|
    n ** 2
  end

  double_it = Proc.new do |n|
    n * 2
  end
  compose(double_it,square_it).call(*args)
end
double_then_square(1)
# 4

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2013-01-27
    • 2021-03-23
    相关资源
    最近更新 更多