代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken

array*string在ruby中是什么意思?

  •  13
  • Aaron Yodaiken  · 技术社区  · 15 年前

    我在查看一些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
    

    “*”做什么?是一个空字符串的乘法吗…?你为什么要这么做。

    6 回复  |  直到 9 年前
        1
  •  13
  •   Peter    15 年前

    这是一个奇怪的语法。它们相当于:

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

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

    注意:如果你做类似的事情 [1, 2, 3] * 3 (使用 int 而不是 str ,您将得到数组的三个串联副本。

        2
  •  5
  •   klochner    15 年前

    它的作用与:

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

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

    根据z.e.d.的建议,如果你想混淆人们并使你的代码更容易出错,你可以使用它。

        3
  •  3
  •   Roman Gonzalez    15 年前

    真的很神秘的密码。

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

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

    我不知道在哪里 Array#* 定义(可能在 ActiveSupport ,但我能告诉你的是,这是它乘以 String

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

    所以我可以推断它是在不使用任何分隔符的情况下对数组的所有元素进行concatating。

        4
  •  2
  •   Jörg W Mittag    15 年前

    Array#* 用一个 String 参数等于 Array#join .

        5
  •  1
  •   user253455    15 年前

    两条评论:

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

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

        6
  •  0
  •   Andrew Grimm Alex Wayne    14 年前

    我看到有人想用 * 连接字符串数组是为了避免使用 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.join 具有 strings.* ,那么你就少了 参加 在你的密码里。现在你可以做一个 grep 对于它们,并检查每一个都是对线程而不是对数组执行的。事实上,你可以选择 Array#join 抛出异常。