Jekyll gem的bin/jekyll
的第一行使用以下语法:
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
我似乎无法弄清楚splat的目的是什么。在IRB中使用和不使用splat运行该行会产生相同的输出"./../lib"
。
答案 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'])
答案 1 :(得分:1)
*使论点变平。相当于没有splat:
File.join(File.dirname(__FILE__), ["..", "lib"])
等同于splat:
File.join(File.dirname(__FILE__), "..", "lib")
我想在这种情况下File.join
会以同样的方式对待它。但是看到documentation意味着他们应该被夷为平地。现在,为什么作者不是简单地写它没有数组或splats是另一回事。