【问题标题】:Ruby: How do I join elements of an array together with a prefix?Ruby:如何将数组的元素与前缀连接在一起?
【发布时间】:2010-10-22 15:34:26
【问题描述】:

我有一个这样的数组:

["marblecake", "also", "the", 1337]

我想取回一个字符串,该字符串包含数组的每个元素,前缀为某个指定的字符串,然后由另一个指定的字符串连接在一起。例如,

["marblecake", "also", "the", 1337].join_with_prefix("%", "__")

应该会导致

# => %marblecake__%also__%the__%1337

我该怎么做?

【问题讨论】:

    标签: ruby arrays string


    【解决方案1】:

    如果您的数组在 a 中,那么这个单行就可以了

    a.map { |k| "%#{k}" }.join("_")
    

    您可以轻松地将其放入您自己的函数中 - 甚至将其添加到 Array 类中,以便您可以在数组上调用它,就像在您的示例中一样。

    请注意,“!”地图版本 (map!) 将修改数组 - 也许不是您的意图。

    【讨论】:

    • 为什么要使用破坏性的原地版本的“map”?根据 OP 代码的样子,这可能会产生一些意想不到的副作用。
    • Jason:这里只存储原语/字符串。你有什么推荐的替代品吗?
    • "map" 返回一个新数组。 “地图!”修改调用它的数组,并返回相同的数组。所以,如果你有这样的代码。 "a.map! { ... something ... }" 然后你再次引用 "a",你会发现 "a" 的元素已经被 "map!" 的结果替换了。块,您可能想要也可能不想要。除非您有特定的理由不这样做,否则我只会使用“map”,它会返回一个新数组并且不会触及现有数组。
    • Jason,你说得对,bang 版本具有破坏性。我想我认为编码器会知道差异并适当地实施。也许这是一个不安全的假设:)
    【解决方案2】:

    虽然这是一个很老的问题,但我想补充一下:

    a.any? && "%".+(a.join("__%"))
    

    【讨论】:

    • 这是一个聪明的解决方案!我非常喜欢这个:)
    • 如果a 为空,则仅返回%
    【解决方案3】:

    根据上述建议:

    class Array
      def join_with_prefix(prefix,separator)
        self.collect {|e| prefix.to_s + e }.join(separator)
      end
    end
    
    p ['ab','cd','ef'].join_with_prefix('%','__')
    
    => "%ab__%cd__​​%ef"

    【讨论】:

    • 这假设您正在尝试加入一个字符串数组 - 例如,如果您有一个整数数组,那么“+ e”部分将失败,因为“+”没有为字符串实现+ 整数。更好的方法是在双引号字符串中使用字符串插值“#{e}”进行字符串连接,这将隐含地to_s您的元素,因此: self.collect {|e| "#{prefix}#{e}" }.join(separator) 更灵活。
    • 或者你可以做prefix.to_s + e.to_s
    【解决方案4】:

    我今天正在寻找解决方案。我发现了这个问题。这是我的解决方案。

    array = ["marblecake", "also", "the", 1337];
    arrayString = ''
    
    array.each{|x| arrayString += "%" + x + "__"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多