8

当我阅读 Rails 代码时,我发现了这个

def save(*)
  create_or_update || raise(RecordNotSaved)
end

做什么的*?:O 我知道当我们使用它时会发生什么*args,但在这种情况下,它只是简单的*

参考https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L119

4

2 回答 2

8

它的含义与使用参数名称时的含义相同:吞噬所有剩余的参数。除了,因为没有名称可以绑定它们,所以参数是不可访问的。换句话说:它接受任意数量的参数,但忽略它们。

请注意,实际上一种使用参数的方法:当您在super没有参数列表的情况下调用时,参数会按原样转发到超类方法。

于 2013-02-18T15:26:47.613 回答
2

在这种特定情况下, save 不接受任何参数。这就是赤裸裸的啪啪声所发生的事情。但是,您可能知道,在ActiveRecord模型上调用 save 接受选项,因为此方法在此处被覆盖ActiveRecord::Validations

https://github.com/rails/rails/blob/v3.1.3/activerecord/lib/active_record/validations.rb#L47

# The validation process on save can be skipped by passing <tt>:validate => false</tt>. The regular Base#save method is
# replaced with this when the validations module is mixed in, which it is by default.
def save(options={})
 perform_validations(options) ? super : false
end
于 2013-02-18T15:11:12.690 回答