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