无法将带有符号AND的Ruby lambda作为块传递

无法将带有符号AND的Ruby lambda作为块传递,ruby,lambda,block,Ruby,Lambda,Block,在离开Ruby很长一段时间后,我将回到Ruby,目前正在为blocks和lambdas之间的关系而挣扎。我知道一般的关系,并且我知道原则上你可以通过在lambda前面加一个符号和来传递一个块 这适用于以下简单示例: (1..5).每个&->(n){n>0} 但我现在遇到了其他不起作用的情况,例如,如果我试图用以下方法来做: PropCheck.forall(integer)&->(n){n>0} 结果: (irb):6:in `<main>': undefined method

在离开Ruby很长一段时间后,我将回到Ruby,目前正在为blocks和lambdas之间的关系而挣扎。我知道一般的关系,并且我知道原则上你可以通过在lambda前面加一个符号和来传递一个块

这适用于以下简单示例:

(1..5).每个&->(n){n>0}
但我现在遇到了其他不起作用的情况,例如,如果我试图用以下方法来做:

PropCheck.forall(integer)&->(n){n>0}
结果:

(irb):6:in `<main>': undefined method `&' for #<PropCheck::Property:0x00007fd1889af040 @config=#<struct PropCheck::Property::Configuration verbose=false, n_runs=100, max_generate_attempts=10000, max_shrink_steps=10000, max_consecutive_attempts=30>, @hooks=#<PropCheck::Hooks:0x00007fd1889aefc8 @before=#<Proc:0x00007fd1889aef78 /usr/local/lib/ruby/gems/3.0.0/gems/prop_check-0.14.1/lib/prop_check/hooks.rb:22>, @after=#<Proc:0x00007fd1889aef50 /usr/local/lib/ruby/gems/3.0.0/gems/prop_check-0.14.1/lib/prop_check/hooks.rb:22>, @around=#<Proc:0x00007fd1889aef28 /usr/local/lib/ruby/gems/3.0.0/gems/prop_check-0.14.1/lib/prop_check/hooks.rb:22>>, @gen=#<PropCheck::Generator:0x00007fd1889af2c0 @block=#<Proc:0x00007fd1889af270 /usr/local/lib/ruby/gems/3.0.0/gems/prop_check-0.14.1/lib/prop_check/generators.rb:84>>> (NoMethodError)
    from /usr/local/Cellar/ruby/3.0.1/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
    from /usr/local/opt/ruby/bin/irb:23:in `load'
    from /usr/local/opt/ruby/bin/irb:23:in `<main>'
(irb):6:in``:for#的未定义方法`&(NoMethodError)
从/usr/local/ceral/ruby/3.0.1/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in`'
from/usr/local/opt/ruby/bin/irb:23:in'load'
from/usr/local/opt/ruby/bin/irb:23:in`'

所以很明显,我忽略了将lambdas作为块传递的一些微妙之处。为什么这样不行?是否有一些我不知道的一般情况,有时会使将lambda作为块传递变得不可接受?

多亏了Sergio和engineersmnky,真正发生的是我误解了常规参数和块参数的参数列表。因此,我可以按照建议做:

PropCheck.forall(integer, &->(n) { n > 0 })

更新:事实上,我看到在快速irb会话中似乎对我有效的第二个选项没有做正确的事情(
PropCheck.forall integer&->(n){n>0}
),因此正确的答案在上面。

将其放在方法调用括号内。paren关闭参数列表,以便
PropCheck.forall(integer)&->(n){n>0}
实际上被解释为
PropCheck.forall(integer)&(->(n){n>0})
相反,您需要将lambda放在参数列表中,例如
PropCheck.forall(integer,&->(n){n>0})
。也就是说,您可能可以通过
PropCheck使用隐式块。对于所有(整数){n{n>0}
,而不是使用
#to_proc
&
)@enginersmnky为什么删除该注释?我认为这是正确的。即使第二行没有导致运行时错误,它也不会产生所需的结果(基于测试我的
PropCheck.forall
)我没有删除该注释?科林,这不是给你的:)不管怎样,重新检查第二行。现在,它不能工作了。@SergioTulentsev我不知道我把它拿走了。此处报告:第二个将无法正常工作,因为这将被解释为
PropCheck.forall(integer.&(->(n){n>0}))
@enginersmnky:当然,除非
integer
是一种方法。然后,该块将绑定到该块,而不是绑定到所有。