我知道当我们不知道要传递的参数数量时会使用splat参数。我想知道我是否应该一直使用splat。每当我传递参数时,使用splat参数是否有任何风险?
答案 0 :(得分:17)
对于像Hash#values_at
这样的方法,当您编写的方法确实需要具有任意数量的参数时,splat非常有用。
一般来说,如果一个方法实际上需要一个固定数量的参数,那么使用命名参数要比传递数组更清楚,并且必须记住哪个位置服务于哪个目的。例如:
def File.rename(old_name, new_name)
...
end
比以下更清楚:
def File.rename(*names)
...
end
您必须阅读文档以了解旧名称是第一个还是第二个。在方法内部,File.rename
需要围绕您是否传递了正确数量的参数来实现错误处理。因此,除非您需要splat,否则“正常”参数通常更清晰。
关键字参数(ruby 2.0中的新增功能)在使用时可以更加清晰,尽管它们在标准库中的使用尚未普及。
答案 1 :(得分:3)
对于需要任意数量参数的方法,options hash是事实上的解决方案:
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
答案 2 :(得分:2)
很好地使用splat是在使用数组时,只想使用数组的第一个参数,并对数组的其余部分执行其他操作。它比其他方法快得多。这是一个聪明的家伙Jesse Farmer使用它https://gist.github.com/jfarmer/d0f37717f6e7f6cebf72,这里是我尝试解决螺旋阵列问题的一些其他方法的例子,以及一些基准测试。 https://gist.github.com/TalkativeTree/6724065
问题在于它不容易消化。如果您之前已经看过并使用过它,那很好,但它可能会减慢其他人对代码正在做什么的理解。如果你有一段时间没看过它,甚至是你自己的。
答案 3 :(得分:1)
Splat让参数被解释为一个数组,你需要一个额外的步骤来取出它。没有splat,你不需要做特殊的事情来访问参数:
def foo x
@x = x
end
但是如果你使用splat将它放在一个数组中,你需要额外的步骤将它从数组中取出:
def foo *x
@x = x.first # or x.pop, x.shift, etc.
end
除非必要,否则没有理由引入额外的步骤。