我正在尝试按照下面给出的Little Schemer示例eq?
实现currying。 eq( test, testFor)
接受测试条件和一个原子,并根据传递的函数test
返回一个函数,它接受一个参数返回一个布尔值。
这是我的代码:
def eq( test, s)
Proc.new { |x| test(s,x)}
end
eqToCarrot = eq(Proc.new{|x,y| x==y},"carrot")
if eqToCarrot.call("carrot")
puts "Equal!"
end
不执行if条件。有人可以告诉我为什么吗?
答案 0 :(得分:2)
要在test
内拨打eq method
,您需要使用test.call
而非test
。
原样,您在Undefined method
中的test(..)
表达式中没有收到eq
或其他错误的原因是有一个名为test
的内核方法接受2或3个参数。
要回答你的评论中关于如何返回一个返回proc的proc的问题,你“只是去做”。例如,您可以返回Proc.new {Proc.new {puts 'foo'}}
。
由于proc变量可以像任何其他变量一样传递和返回,而不用担心它们被意外“调用”,如果你传入proc变量作为参数,你可以简单地返回该变量,如{{1 }}
但是,在您的情况下,如果您尝试根据传入的参数创建谓词,则可以执行以下操作:
Proc.new {|proc| proc}