【问题标题】:what happens when *args is passed to yield in ruby在 ruby​​ 中将 *args 传递给 yield 时会发生什么
【发布时间】:2017-04-19 13:19:46
【问题描述】:

当 *args 传递给 ruby​​ 中的 yield 时会发生什么,在 rails 的 capture_helper.rb 中我看到了一条语句,其中 *args 传递给了 yield 语句,当我们这样做时实际发生了什么。

 buffer = with_output_buffer { value = yield(*args) }

第一个参数是构建器对象,第二个参数是传递的块

【问题讨论】:

标签: ruby-on-rails ruby yield form-for


【解决方案1】:

Splats 在红宝石中有很多用途。当您在方法调用中使用 splat 时,它会将数组转换为参数列表。

def test(*args)
  args
end

考虑以下示例:

a = [1,2,3]
test(a)
# => [[1, 2, 3]]
test(1,2,3)
# => [1, 2, 3]
test(*a)
# => [1, 2, 3]

在第一个示例中,数组被视为第一个参数,因此结果是数组中的一个数组。而*[1,2,3] 对数组进行解构以便我们得到想要的结果。

这使得它对于调用带有可变数量参数的方法非常有用。 yield 在这方面与任何其他方法一样工作,因为使用 splat 将解构 args 中的数组并使用参数列表调用传递的块。

【讨论】:

    【解决方案2】:

    使用 * 运算符 (splat operator) 为变量(必须是数组或哈希)添加前缀,提取数组的值:

    ary = [1, 2, 3]
    
    def foo(a, b, c)
      a + b + c
    end
    
    foo(ary)
    # => ArgumentError: wrong number of arguments (given 1, expected 3)
    
    foo(*ary)
    # 6
    

    yield 相同,只是将值传递给块:

    def bar
      ary2 = [5, 6]
      yield(*ary2)
    end
    
    bar do |x, y|
      puts x + y
    end
    # 11
    

    【讨论】:

    • 但是,我见过的大部分代码, * 在方法定义中用于接受任意数量的参数而不是参数列表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多