为什么这些默认参数定义为它们?

时间:2009-05-24 16:42:22

标签: ruby-on-rails ruby

我目前正在学习Ruby和RoR,我偶然发现了这个声明:

link_to_remote(name, options = {}, html_options = nil) 

我发现这个模式用于其他几个Rails函数。

为什么默认值是这样定义的?为什么不是这两个中的一个?

... options = {}, html_options = {}) 
... options = nil, html_options = nil) 

这是我在自己的职能中应遵循的某种惯例吗?

2 个答案:

答案 0 :(得分:1)

方法定义如下:

link_to_function(name, remote_function(options), html_options || options.delete(:html))

这允许您将html_options指定为options哈希的一部分,而不是单独的参数。另一方面,options哈希总是传递给remote_function,所以我们需要它。

使用单例nil而不是构造一个每次调用方法时都不会使用的数组也更有效。我不会说这个理由如此引人注目,以至于我不会使用{}如果它使得结果代码更清晰,但在没有任何其他考虑的情况下,这似乎是合乎逻辑的事情。

答案 1 :(得分:0)

不是专家,但对于options,可能是因为调用代码使用merge方法将传入的任何内容与假定的默认值组合在一起;将其设置为nil只会删除所有选项。我不确定html_options,但它可能与此类似。

html_options可能会调用一个块并定义一些内容来检查是否给出了哈希值。就像我说我不是专家,但这可能就是原因。我刚刚检查了一个Ubuntu VM,根据irb,空哈希计算结果为true,这可能就是原因。调用代码可能使用带有某行的块:

if html_options
    # do stuff
end

默认情况下它是nil,因为代码会执行,并且可能会在空哈希时给你一个nil错误