Jekyll 的 bin/jekyll
的第一行gem 使用以下语法:
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
我似乎无法弄清楚这个splat的目的是什么。在 IRB 中运行带或不带 splat 的该行会产生相同的输出 "./../lib"
。
最佳答案
至少在 Ruby 1.9.3 中,join
方法的两种用法似乎是等效的。 Under the hood ,数组的元素以递归方式加入
到路径,并具有防止无限递归的特殊保护。
因此,这工作正常:
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'])
关于ruby - 解释这个 Ruby 数组语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854502/