array * string在Ruby中意味着什么?

我正在浏览一些Rails源代码并遇到过

# File vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2/builder/css.rb, line 129 129: def target! 130: @target * '' 131: end 

*”做什么? 那是乘空字符串……? 你为什么要这样做呢。

这是一种奇怪的语法。 这些是等价的:

 >> [1, 2, 3] * 'joiner' => "1joiner2joiner3" >> [1, 2, 3].join 'joiner' => "1joiner2joiner3" 

所以在这种情况下,它将@target所有条目@target成一个字符串,条目之间没有任何内容。

注意:如果您执行类似[1, 2, 3] * 3 (使用int而不是str )的操作,则会获得三个连续的数组副本。

它做同样的事情:

 ["foo","bar","baz"].join 

http://ruby-doc.org/core/classes/Array.html#M002210

根据ZED的建议,如果你想让人混淆并使你的代码更容易出错,你会使用它。

确实是非常神秘的代码。

检查完源代码后,我意识到@target实际上是一个Array实例,我知道你可以做这样的事情

 [5] * 5 # => [5,5,5,5,5] 

我不知道Array#*的定义位置(可能在ActiveSupport ),但我可以告诉你的是,这是它乘以一个String时的行为

 [1,2,3] * 'comma' # => "1comma2comma3" [1,2,3] * '' # => '123' 

所以我可以推断它是在没有任何分隔符的情况下连接数组的所有元素。

带有String参数的Array#*等同于Array#join

两条评论:

  1. 有一个 ! 结束方法名称意味着它是一个变异操作,这个例子似乎不是。

  2. 正如其他人所说,它确实是神秘的。 我会选择@ target.to_s或@ target.join

我看到有人想要使用*加入一个字符串数组的唯一原因是他们想要避免使用单词join ,这也是在线程上使用的。

具有以下内容:

 strings = ["John", "Smith"] threads = [Thread.new{puts "hai"}, Thread.new{ puts "world!"}] strings.join(" ") # Legit threads.each {|thread| thread.join} # Legit 

你可能犯了错误

 threads.join # Not legit, but won't raise an error 

如果你用strings.*替换strings.join ,那么你的代码中的join数就会减少。 现在你可以为它们做一个grep ,并检查每个是对一个线程,而不是一个数组。 实际上,您可以选择使Array#join抛出exception。