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
。
两条评论:
-
有一个 ! 结束方法名称意味着它是一个变异操作,这个例子似乎不是。
-
正如其他人所说,它确实是神秘的。 我会选择@ 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。