Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 试图用';正方形,然后是双';例子_Ruby_Proc - Fatal编程技术网

Ruby 试图用';正方形,然后是双';例子

Ruby 试图用';正方形,然后是双';例子,ruby,proc,Ruby,Proc,我试图理解为什么这段代码有效。具体来说, 1.在compose的方法定义中,为什么必须创建新的过程?为什么不能在不创建新proc的情况下调用proc2和proc1 2.我尝试创建函数“double_then_square”,但它只能用作赋值。是不是因为方法中不能有方法?递归不是一个反例吗?或者是一个规则,在方法中不能有不同的方法 def compose(proc1, proc2) Proc.new do |x| proc2.call(proc1.call(x))

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

1.在compose的方法定义中,为什么必须创建新的过程?为什么不能在不创建新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\u then\u square
    时,这将立即执行,这显然是不可能的,因为我们还不知道
    1
    正在被传递。相反,您需要的是可以调用的内容,例如,在上发送
    .call(1)
    。也就是说,我们希望返回一个
    Proc

  • 不,这应该是可行的。但是,您将无法访问局部变量,因此必须在方法中定义它们。因为它是一个正确的方法,所以您也将直接调用它,而不是使用
    。call
    。下面的代码适用于我



  • 如果您描述一下您是如何尝试创建您所说的
    double\u then\u square
    函数的,这会有所帮助。另外,试着扩展一下您认为递归与此相关的内容。另外,还有一个问题:为什么您特别使用ruby来学习这些概念?Ruby在函数式编程模式(块、方法、过程、lambda以及它们之间的细微差别)方面有点古怪,因为它是一种强烈的OO语言。Python或javascript可能是更好的选择。我以前的问题都得到了回答。我之所以使用Ruby,是因为这是我一直遵循的指南。你认为有必要转换语言来理解这些概念吗?不,一点也不,ruby确实有。只是它不那么容易地把自己借给他们,你会不断地碰到本质上的OO。Python、Javascript和Ruby都是多范式的,但Python和Javascript更倾向于FP,Ruby更倾向于OOP。
    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