Ruby中一个匿名函数的参数

Ruby中一个匿名函数的参数,ruby,Ruby,我想知道这段代码的含义,以便找到一个可能的bug: ->a、b、c、d、e、f、g、h、i、j{ l=->s,t=c{ 数学日志(s,t) } } 谢谢第一部分:->a、b、c、d、e、f、g、h、i、j{…}是lambda或匿名函数的声明 其中a,b,c。。。等等是作为块内变量传递的参数{..} 这与:lambda{a,b,c,…j} 您可以在此处看到一个类似的示例: ex1 = -> a,b,c,d { puts a; puts b; puts c; } ex1.cal

我想知道这段代码的含义,以便找到一个可能的bug:

->a、b、c、d、e、f、g、h、i、j{
l=->s,t=c{
数学日志(s,t)
}
}

谢谢

第一部分:
->a、b、c、d、e、f、g、h、i、j{…}
是lambda或匿名函数的声明

其中a,b,c。。。等等是作为块内变量传递的参数
{..}

这与:
lambda{a,b,c,…j}

您可以在此处看到一个类似的示例:

ex1 = -> a,b,c,d {
  puts a;
  puts b;
  puts c;
}

ex1.call('1', '2', '3', '4');
然后返回其中的另一个lambda:

l=
->
s,t=c{Math.log(s,t)

->
符号所示,默认
t
参数为先前在外部lambda中提供的
c
arg

最后,它从内部lambda调用s和t参数的Math.log

以下是一个简化版本:

ex2 = -> a,b { c = -> d, e = b { puts d; puts e } }

ex2.call(1,2).call(3) # e is optional since it's defaulted to b
# => 3,2

注意:您的代码缺少一些
}

老实说,这段代码非常可怕。我会惊讶地发现只有一个bug

这里有一个重写:

weird_log = lambda do |_, _, default_base, _, _, _, _, _, _, _|
  lambda do |x, base=default_base|
    Math.log(x, base)
  end
end
它更具可读性,并且清楚地表明方法签名是无用的。在原始代码中,从10个原始参数中只使用了
c

a、b、d、e、f、g、h、i、j未被使用,因此可以将它们重命名为
\uu
。但是,即使未使用它们,也需要指定它们:

weird_log.call(nil, nil, 10)
#=> ArgumentError: wrong number of arguments (given 3, expected 10)
weird_log.call(nil, nil, 10, nil, nil, nil, nil, nil, nil, nil)
#=> #<Proc:0x00000000031e57c8@(pry):9 (lambda)>
weird_log.call(nil, nil, 10, nil, nil, nil, nil, nil, nil, nil).call(100)
#=> 2.0
weird_log.call(nil, nil, 10, nil, nil, nil, nil, nil, nil, nil).call(100, Math::E)
# => 4.605170185988092
它可以这样使用:

log10 = my_log(10)
# => #<Proc:0x000000000222d2b8@(irb):2 (lambda)> 
log10.call(100)
# => 2.0
natural_log = my_log
#=> #<Proc:0x0000000002243540@(irb):2 (lambda)>
natural_log.call(10)
#=> 2.302585092994046

您为哪种代码编写了简化版本?它似乎与OP的代码或您的第一个示例不匹配。概念的简化版本,而不是代码本身。这段代码来自哪里?我希望这是一个在Ruby中不能做什么的例子。这只是函数的开始,它继续使用所有参数…哎哟。它缩小了吗?这个lambda的目的是什么?@EricDuminil在codegolf比赛中获得了一到两个角色……我觉得奇怪的是,虽然这个问题由于不清楚被问到了什么而被搁置,但迄今为止它已经收到了三张赞成票,这表明至少有三位读者不仅理解它,而且认为它是一个好问题。(我在“不知道”阵营。)
log10 = my_log(10)
# => #<Proc:0x000000000222d2b8@(irb):2 (lambda)> 
log10.call(100)
# => 2.0
natural_log = my_log
#=> #<Proc:0x0000000002243540@(irb):2 (lambda)>
natural_log.call(10)
#=> 2.302585092994046
Math.log(100, 10)
# => 2.0
Math.log(10)
# => 2.302585092994046