我知道当我们不知道要传递的参数数量时使用 splat 参数。我想知道我是否应该一直使用 splat。每当我传递参数时,使用 splat 参数是否有任何风险?
4 回答
当您正在编写的方法确实需要具有任意数量的参数时,splat 非常棒,例如Hash#values_at
.
不过,一般来说,如果一个方法实际上需要固定数量的参数,那么命名参数要比传递数组并且必须记住哪个位置服务于哪个目的要清楚得多。例如:
def File.rename(old_name, new_name)
...
end
比:
def File.rename(*names)
...
end
您必须阅读文档才能知道旧名称是第一名还是第二名。在方法内部,File.rename
需要围绕您是否传递了正确数量的参数来实现错误处理。因此,除非您需要 splat,否则“正常”的论点通常会更清晰。
关键字参数(ruby 2.0 中的新功能)在使用时可以更加清晰,尽管它们在标准库中的使用还没有广泛使用。
对于采用任意数量参数的方法,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
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
除非必要,否则没有理由引入额外的步骤。