解释这个Ruby数组语法

解释这个Ruby数组语法,ruby,rubygems,jekyll,Ruby,Rubygems,Jekyll,gem的bin/jekyll的第一行使用以下语法: $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib]) 我似乎搞不清楚这件事的目的是什么。在IRB中使用和不使用splat运行该行将导致相同的输出“/。/lib” 至少在Ruby 1.9.3中,join方法的两种用法似乎是等效的,数组的元素以递归方式连接到路径,并具有针对无限递归的特殊保护 因此,这很好: File.join 'a', ['b', ['c']] 有人可能会说spla

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

$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
我似乎搞不清楚这件事的目的是什么。在IRB中使用和不使用splat运行该行将导致相同的输出
“/。/lib”


至少在Ruby 1.9.3中,
join
方法的两种用法似乎是等效的,数组的元素以递归方式连接到路径,并具有针对无限递归的特殊保护

因此,这很好:

File.join 'a', ['b', ['c']]
有人可能会说splat操作符的目的是消除递归。问题在于:

File.join 'a', *['b', ['c']]
相当于:

File.join 'a', 'b', ['c']
为了消除递归,必须将数组展平,然后将其展平:

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'])

.

用*将参数展平。不带splat的同等产品:

File.join(File.dirname(__FILE__), ["..", "lib"])
File.join(File.dirname(__FILE__), "..", "lib")
与splat等效:

File.join(File.dirname(__FILE__), ["..", "lib"])
File.join(File.dirname(__FILE__), "..", "lib")
我猜在这种情况下,
File.join
也会以同样的方式处理它。但请注意,这意味着它们应该被压平。现在,作者为什么不简单地编写没有数组或splats的代码是另一回事