Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么ruby中的splat参数没有一直使用?_Ruby_Splat - Fatal编程技术网

为什么ruby中的splat参数没有一直使用?

为什么ruby中的splat参数没有一直使用?,ruby,splat,Ruby,Splat,我知道当我们不知道要传递的参数数量时,会使用splat参数。我想知道我是否应该一直使用splat。每当我传递参数时,使用splat参数是否有任何风险?如果您正在编写的方法确实需要任意数量的参数,例如Hash\values\u at之类的方法,那么splat非常有用 不过,一般来说,如果一个方法实际上需要固定数量的参数,那么使用命名参数要比传递数组和记住哪个位置适合哪个目的要清楚得多。例如: def File.rename(old_name, new_name) ... end 这比: de

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

如果您正在编写的方法确实需要任意数量的参数,例如
Hash\values\u at
之类的方法,那么splat非常有用

不过,一般来说,如果一个方法实际上需要固定数量的参数,那么使用命名参数要比传递数组和记住哪个位置适合哪个目的要清楚得多。例如:

def File.rename(old_name, new_name)
  ...
end
这比:

def File.rename(*names)
  ...
end
您必须阅读文档才能知道旧名称是第一个还是第二个。在方法内部,
File.rename
需要实现错误处理,以确定是否传递了正确数量的参数。因此,除非您需要splat,“正常”参数通常更清晰


关键字参数(ruby 2.0中新增的)在使用上更加清晰,尽管它们在标准库中的使用还没有普及。

Splat允许将参数解释为数组,您需要额外的步骤才能将其删除。没有splat,您不需要执行特殊操作来访问参数:

def foo x
  @x = x
end
但如果使用splat将其放入阵列中,则需要额外的步骤将其从阵列中取出:

def foo *x
  @x = x.first # or x.pop, x.shift, etc.
end

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

对于采用任意数量参数的方法,选项哈希是一种事实上的解决方案:

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对它的使用,这是我尝试解决螺旋阵列问题的其他方法的一个例子,以及一些与之相关的基准测试


问题是它不容易消化。如果您以前看过并使用过它,那就太好了,但是它会减慢其他人对代码的理解。即使是你自己的,如果你已经有一段时间没看了哈。

+1“有真正的需要…”是这里的一个关键短语。在我看来,一直人为地使用
*
“仅仅因为”,会造成维护问题,导致Ruby代码不那么惯用。现在使用命名参数比以前更有意义,例如,通过
**
操作数传递散列并转换为命名参数时。