解释这个Ruby数组语法

时间:2012-03-24 18:49:16

标签: ruby rubygems jekyll

Jekyll gem的bin/jekyll的第一行使用以下语法:

$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])

我似乎无法弄清楚splat的目的是什么。在IRB中使用和不使用splat运行该行会产生相同的输出"./../lib"

https://github.com/mojombo/jekyll/blob/master/bin/jekyll

2 个答案:

答案 0 :(得分:1)

至少在Ruby 1.9.3中,join方法的两种用法似乎都是等价的。 Under the hood,数组的元素递归地join到路径,具有针对无限递归的特殊保护。

因此,这很好用:

File.join 'a', ['b', ['c']]

有人可能会说splat运算符的目的是消除递归。问题是:

File.join 'a', *['b', ['c']]

等同于:

File.join 'a', 'b', ['c']

为了消除递归,你必须flatten数组和然后 splat it:

File.join 'a', *['b', ['c']].flatten

在参数列表的上下文中,splat运算符“删除”数组的括号,可以这么说。结果如下:

# File.join receives 3 strings as parameters
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')

与此相反:

# File.join receives 2 parameters, one string and one array of strings
$:.unshift File.join(File.dirname(__FILE__), ['..', 'lib'])

More information about the splat operator

答案 1 :(得分:1)

*使论点变平。相当于没有splat:

File.join(File.dirname(__FILE__), ["..", "lib"])

等同于splat:

File.join(File.dirname(__FILE__), "..", "lib")

我想在这种情况下File.join会以同样的方式对待它。但是看到documentation意味着他们应该被夷为平地。现在,为什么作者不是简单地写它没有数组或splats是另一回事。