参数'args =(not_set = true)'在红宝石中意味着什么?

时间:2013-07-02 15:53:39

标签: ruby-on-rails ruby

我在github API v3中找到了方法定义,我不知道args=(not_set = true)的含义。

您能告诉我一些使用示例吗?感谢。

# Acts as setter and getter for api requests arguments parsing.
#
# Returns Arguments instance.
#
def arguments(args=(not_set = true), options={}, &block)
  if not_set
    @arguments
  else
    @arguments = Arguments.new(self, options).parse(*args, &block)
  end
end

3 个答案:

答案 0 :(得分:4)

有趣的问题不是代码的工作原理:如果未传递args,则会评估代码not_set = true

相反,重要的问题是为什么有人会遇到这种麻烦?毕竟,更简单的替代方案通常可以正常工作:

def arguments(args = nil)
  if args.nil?
    ...
  else
    ...
  end
end

但是,这种方法不允许您区分这两个调用:

arguments()
arguments(nil)

如果这种区别很重要,您可以使用类似您发布的代码中的方法。

答案 1 :(得分:2)

只有在您没有传递数据时才会触发args setter方法。

如果你这样做:

arguments("foo")

然后:

  • args #=> "foo"
  • not_set #=> nil这是假的

如果你这样做:

arguments()

然后:

  • args #=> nil
  • not_set #=> true

简而言之:检查一个arg是否确实设置是一种非常简洁的方法。

答案 2 :(得分:2)

根据此blog,参数的默认值可以是已执行表达式的结果。因此,他们正在做的是在表达式中设置一个标志(not_set = true)并将其用作默认值。因此,在未指定“args”的情况下,将评估表达式(not_set = true)。

阅读link for really interesting examples