【问题标题】:Ignore lambda argument checking忽略 lambda 参数检查
【发布时间】:2016-04-14 11:58:00
【问题描述】:

我想将表现出 lambda 行为(参数检查)的过程转换为不表现出 lambda 行为的过程。以下是一个非常人为的示例,但它应该能够理解重点:

目的是创建一个看起来像这样的 DSL:

NumberSeries.perform do
  add first_series:  -> { natural_numbers.take(10) },
      second_series: -> { fibonacci_numbers.take(10) }
end

请注意,natural_numbersfibonacci_numbers 不会作为 DSL 中的参数传递。 add 的实现如下所示:

NaturalNumbersFibonacciNumbers = Struct.new(:natural_numbers, :fibonacci_numbers)
FAMOUS_NUMBER_SERIES = NaturalNumbersFibonacciNumbers.
                         new(natural_numbers, fibonacci_numbers)

def add(first_series:, second_series:)
  first_numbers  = FAMOUS_NUMBER_SERIES.instance_eval(&first_series)
  second_numbers = FAMOUS_NUMBER_SERIES.instance_eval(&second_series)
  first_numbers.zip(second_numbers).map { |x, y| x + y }
end

现在,如果我在 DSL 中将 -> 替换为 proc,它将起作用。但是,保留 lambda,我会得到

ArgumentError: 参数数量错误(1 代表 0)

BasicObject#instance_eval 将 self 生成给 lambda,但 lambda 不需要任何参数。


出于显而易见的原因,我不想使用 Fiddle

【问题讨论】:

  • instance_exec 是否可以代替 - 允许您传递参数(或在这种情况下不传递)?
  • 我很困惑。为什么不直接用 procs 定义你的 DSL? add first_series: proc { natural_numbers.take(10) } 同样优雅。
  • @matt,是的,instance_exec 成功了。不知道我怎么没想到。即使它没有回答问题,但它解决了原始问题,所以添加它作为答案,如果没有人知道该怎么做,我会接受它。
  • @SergioTulentsev - 对于 Rubist - 是的。一般来说 - 没有。
  • 对于这个特定的任务:&->(*args) { λ.call }。对于一般的lambda,可能会检查λ.parameters 并构建相应的proc 包装器。唯一的问题是:为什么地球上会有人需要它?

标签: ruby lambda proc


【解决方案1】:

instance_execinstance_eval 的替代品,它允许您控制传递给块的参数,并且不像instance_eval 那样传递接收器。您可以将其用作解决问题的方法,因为它允许您传递零参数:

irb:108:0>  Object.new.instance_eval &-> { puts "Hello" }
ArgumentError: wrong number of arguments (given 1, expected 0)
    from (irb):108:in `block in irb_binding'
    from (irb):108:in `instance_eval'
    from (irb):108
    from /Users/matt/.rubies/ruby-2.3.0/bin/irb:11:in `<main>'
irb:109:0>  Object.new.instance_exec &-> { puts "Hello" }
Hello
=> nil

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多