0

我正在尝试按照eq?下面给出的 Little Schemer 示例来实现柯里化。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 条件不执行。有人能告诉我为什么吗?

4

1 回答 1

2

test在你的内部调用eq method,你需要使用test.call而不是仅仅使用test.

照原样,您没有从表达式中收到Undefined method错误或其他错误的原因是有一个名为 Kernel 的方法,它接受 2 个或 3 个参数。test(..)eqtest

要在您的评论中回答有关如何返回返回 proc 的 proc 的问题,您“就这样做”。例如,您可以返回Proc.new {Proc.new {puts 'foo'}}.

并且由于 proc 变量可以像任何其他变量一样被传递和返回,而不必担心它们被意外“调用”,如果您将 proc 变量作为参数传递,您可以简单地返回该变量,如Proc.new {|proc| proc}.

但是,在您的情况下,如果您尝试基于传入的参数创建谓词,则可以执行以下操作:

def make_eq_proc(match_string)
  Proc.new {|arg_string| arg_string == match_string}
end

eq_carrot = make_eq_proc('carrot')

eq_carrot.call('carrot') # => true
于 2013-09-12T18:17:38.560 回答