无法调用Ruby Lambda函数。

4

我在以下调用Ruby lambda时遇到了问题。

我有一个接受Proc的函数,并且下面是lambda定义。

def call_proc_with_arg(&b)
   b.call(1)
end

lam = -> (a) { puts "printing the argument #{a}"}

当我尝试将lambda传递给函数时,

call_proc_with_arg(lam)

我遇到了错误:

回溯(最近的调用在最后): 6: 来自 /usr/bin/irb:23:in <code><main>' 5: 来自 /usr/bin/irb:23:in load' 4: 来自 /Library/Ruby/Gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in <top (required)>' 3: 来自 (irb):118 2: 来自 (irb):118:in rescue in irb_binding' 1: 来自 (irb):52:in `call_block' 参数错误(给定1个,期望0个)

然而该函数可与块一起使用。

call_proc_with_arg {|a| puts "printing the argument #{a}"}

我对lambda表达式漏了什么?


1
什么是call_block - Sebastián Palma
应该是 call_proc_with_arg。已更正。谢谢! - Kannan Ramamoorthy
有两个选项:(1)从&b中删除&,或者(2)向lam添加&call_proc_with_arg(&lam) - Matt
1
顺便提一下:由于您已经在call_proc_with_arg(lam)上遇到了参数错误,所以问题不在于调用lambda函数,而在于传递lambda函数。 - Stefan
2个回答

3

你需要使用以下语法调用该方法并传递代码块,因为在方法签名中你定义了b作为代码块:

call_proc_with_arg(&lam)

你只能使用call_proc_with_arg(lam),如果你将参数不是作为方法块,而是作为第一类参数进行处理:
def call_proc_with_arg(b)
   b.call(1)
end

call_proc_with_arg(lam)

每种语法都有其优点和缺点,具体取决于使用情况。如果想要利用块,则第一种语法是最常见的。在这种情况下,您还可以使用更常见的yield语法:
def call_proc_with_arg(&b)
   yield 1
end

与其直接引用代码块变量b,不如使用间接方式。

如果你想传递多个lambda作为参数,第二种方法是必需的,因为一个单独的方法不能接受多个块。


使用 yield 可以省略 &b - Stefan

1
你可以用不同的方式来调用它。
lam = -> (a) { puts "printing the argument #{a}"}

# method with parameter as lambda
def call_proc_with_arg(b)
  b.call(1)
end

call_proc_with_arg(lam)

# method without parameters
def call_proc_with_arg
  yield 1
end

call_proc_with_arg(&lam)

# method without parameters with named block
def call_proc_with_arg(&b)
  b.call(1)
end

call_proc_with_arg(&lam)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接