ruby - 解释这个 Ruby 数组语法

标签 ruby rubygems jekyll

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

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

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

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

最佳答案

至少在 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'])

More information about the splat operator .

关于ruby - 解释这个 Ruby 数组语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9854502/

相关文章:

ruby - 杰基尔 vs RefineryCMS?

ruby - 为什么 "lay' s"变成 "layaposs"?

ruby - Debian 上的 ruby​​gems 有什么用?这是不同的和奇怪的

rubygems - ruby "Argument list too long"

ruby-on-rails - 如何在activeadmin中添加tinymce-rails gem?

Jekyll 多个固定链接支持

ruby - gem "jekyll"的Bundler兼容版本

ruby - Chef - Chef::Resource::Application 中的 NoMethodError

ruby-on-rails - 如果运行多个池,延迟作业会初始化多少个 Rails 实例

ruby-on-rails - Ruby 中的日期验证