【问题标题】:Optional argument syntax可选参数语法
【发布时间】:2015-08-15 06:07:07
【问题描述】:

我在this question 下找到了这段代码,它检查是否有任何参数传递给方法:

def foo(bar = (bar_set = true; :baz))
  if bar_set
    # optional argument was supplied
  end
end

; :baz 在这个默认值中的用途是什么,我会在什么情况下使用它?

【问题讨论】:

  • 编写代码以打印bar(也许还有bar_set),然后先用零参数调用foo,然后再用一个参数调用。
  • 很有指导意义,谢谢。

标签: ruby optional-arguments


【解决方案1】:

这个想法是= (bar_set = true; :baz) 将仅在未将值传递给bar 参数时进行评估。

在 Ruby 中,多个连续表达式的返回值是最后一个表达式的值。因此= (bar_set = true; :baz) 将值true 分配给bar_set,然后将:baz 设置为bar 的值(因为括号中的代码将计算为:baz,它是最后一个表达式)。

如果传递了一个参数,bar_set 将是 nil,bar 的值将是给定的任何值。

【讨论】:

  • 这是必需的,因为您用作默认值的任何值也可以由调用者传递,因此无法通过查看值来知道是否传递了参数。但是一种方法可能想知道这一点。例如,如果您有一个允许非常快速折叠的自定义集合,您可能想要覆盖 Enumerable#inject,但它的合同非常复杂,它基本上有 4 个“重载”。这对 YARV、JRuby 和 co 来说不是问题,因为它们用 C 或 Java 实现它,因此对 VM 具有特权访问权限,但在 Ruby 中,您需要这样的技巧。
  • :-D 我只是注意到激发这个问题的答案是我的 :-D
猜你喜欢
  • 2017-03-15
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 2020-04-11
  • 2015-12-20
  • 2019-03-08
  • 2015-03-01
相关资源
最近更新 更多