【发布时间】:2013-05-14 03:10:11
【问题描述】:
我知道当我们不知道要传递的参数数量时使用 splat 参数。我想知道我是否应该一直使用 splat。每当我传递参数时,使用 splat 参数是否有任何风险?
【问题讨论】:
我知道当我们不知道要传递的参数数量时使用 splat 参数。我想知道我是否应该一直使用 splat。每当我传递参数时,使用 splat 参数是否有任何风险?
【问题讨论】:
当您正在编写的方法确实需要具有任意数量的参数时,对于 Hash#values_at 这样的方法来说,splat 非常好。
一般来说,如果一个方法实际上需要固定数量的参数,那么使用命名参数比传递数组并且必须记住哪个位置用于哪个目的要清楚得多。例如:
def File.rename(old_name, new_name)
...
end
比:
def File.rename(*names)
...
end
您必须阅读文档才能知道旧名称是第一名还是第二名。在方法内部,File.rename 需要围绕您是否传递了正确数量的参数来实现错误处理。因此,除非您需要 splat,否则“正常”的论点通常会更清晰。
关键字参数(ruby 2.0 中的新功能)在使用时可以更加清晰,尽管它们在标准库中的使用尚未广泛。
【讨论】:
*,“只是因为”,会造成维护问题,并导致 Ruby 代码的惯用性降低。
** 操作数传递哈希并转换为命名参数时。
对于采用任意数量参数的方法,选项哈希是事实上的解决方案:
def foo(options = {})
# One way to do default values
defaults = { bar: 'baz' }
options = defaults.merge(options)
# Another way
options[:bar] ||= 'baz'
bar = options[bar]
do_stuff_with(bar)
end
【讨论】:
当您使用数组并只想使用数组的第一个参数并对数组的其余部分执行其他操作时,可以很好地使用 splat。它也比其他方法快得多。这是一个聪明人 Jesse Farmer 对它的使用https://gist.github.com/jfarmer/d0f37717f6e7f6cebf72,这是我尝试解决螺旋阵列问题的其他一些方法的一个例子,以及一些与之相关的基准。 https://gist.github.com/TalkativeTree/6724065
它的问题是它不容易消化。如果您以前看过并使用过它,那很好,但它可能会减慢其他人对代码在做什么的理解。如果你有一段时间没看的话,甚至是你自己的哈。
【讨论】:
Splat 让参数被解释为一个数组,你需要一个额外的步骤来取出它。如果没有 splat,您无需执行特殊操作即可访问参数:
def foo x
@x = x
end
但如果你使用 splat 将它放入数组中,则需要额外的步骤才能将其从数组中取出:
def foo *x
@x = x.first # or x.pop, x.shift, etc.
end
除非必要,否则没有理由引入额外的步骤。
【讨论】: