【问题标题】:Repeating String N times - multiplication VS enumerator重复字符串 N 次 - 乘法 VS 枚举器
【发布时间】:2020-01-24 23:09:54
【问题描述】:

使用乘法有什么区别(假设n是整数):

new_string = string * n

和一个枚举器:

new_string = ""
n.times do { new_string += string }`

输出似乎相同,但我不确定哪种方法是正确/正确

我很感激对此的一些意见。

【问题讨论】:

    标签: ruby string integer enumeration


    【解决方案1】:

    输出应该不同。第一个选项创建一个 String 的新实例,其中包含 string 重复 n 次。第二个选项在每次迭代中都会改变原始的string,因此它的重复次数远远超过n 次。

    例如:

    string = 'Abc'
    n = 3
    n.times do { string += string }
    

    后续迭代后string 的值将是:

    init: Abc
    'AbcAbc'
    'AbcAbcAbcAbc'
    

    如果您使用不同的字符串作为缓冲区,这可能会以相同的方式工作:

    new_string = ""
    n.times { new_string += string }
    

    我认为string * n 的内存效率更高(只有一个新分配)。

    【讨论】:

    • 谢谢,我忘了初始化一个空字符串。修复了帖子。
    • 如果初始化空字符串,区别主要在于内存占用和可读性。我强烈推荐string * n版本
    【解决方案2】:

    String#* 是用 C 实现的,但我希望 Ruby 等效如下。

    class String
      def *(n)
        return "" if n.zero?
        (n-1).times.reduce(dup) { |s,_| s << self }
      end
    end
    

    str = 'abc'
    str*(3)
      #=> "abcabcabc"
    

    我们看到,对于n &gt; 0str 被附加到str n-1 次的dup 之后。不创建临时数组。这不会改变str (str #=&gt; "abc")。

    现在考虑:

    str = 'abc'
    n = 3
    
    new_string = ""
    n.times do { new_string += str }  
    

    这也不会改变str,但因为new_string += str 扩展为

    new_string = new_string + str
    

    我们看到这个表达式的右侧导致n 数组被创建,变量new_string 被依次分配给每个数组。因此,n-1 临时数组是孤立的,必须进行垃圾回收。这样做没有问题,但这是一个相对低效的操作。

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多