为什么ruby中的splat参数不是一直使用的?

时间:2013-05-19 12:25:26

标签: ruby splat

我知道当我们不知道要传递的参数数量时会使用splat参数。我想知道我是否应该一直使用splat。每当我传递参数时,使用splat参数是否有任何风险?

4 个答案:

答案 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

除非必要,否则没有理由引入额外的步骤。