繁体   English   中英

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

[英]What does array * string mean in 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抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM