【问题标题】:What the difference between Ruby + and concat for arrays?数组的 Ruby + 和 concat 有什么区别?
【发布时间】:2019-06-14 06:53:48
【问题描述】:

我一直在尝试将带有数字的数组收集到一个数组中。如果我尝试使用 + 它会返回 emty 数组作为输出。使用 concat 返回预期的数字数组。它是如何工作的,这些 Ruby 方法之间的主要区别是什么?

0.step.with_object([]) do |index, output|
  output + [index]
  break output if index == 100
do # returns empty array

0.step.with_object([]) do |index, output|
  output.concat [index]
  break output if index == 100
end # returns an array contains digits from 0 to 100

【问题讨论】:

  • 顺便说一句,output.concat [index] 等同于 output << index - 您不必将单个元素包装在数组中即可将其附加到另一个数组。
  • 还有很多更好的方法可以实现“将带有数字的数组收集到一个数组中”的目标您当前的代码相当于0.upto(100).to_a(0..100).to_a0.upto(100).reduce([],&:<<)等。但是你有一个ArrayArrays 你试图折叠它们arr_of_arrs.reduce(&:concat) 可以工作,但最简单的方法就是arr_of_arrs.flatten。如果您想累积它们但维护内部数组,那么arr_of_arrs.reduce([],&:+)

标签: arrays ruby concat step


【解决方案1】:

Enumerable#reduce 不同,Enumerable#each_with_object 通过归约过程传递同一个对象。

Array#+ 创建一个新实例,保持原始对象不变。
Array#concat 变异原始对象。

reduce 的结果是一样的:

0.step.reduce([]) do |acc, index|
  break acc if index > 100
  acc + [index]
end

【讨论】:

    【解决方案2】:

    让我们创建两个数组:

    a = [1, 2]
    b = [3, 4]
    

    与所有对象一样,这些数组具有唯一的对象 ID:

    a.object_id  #=> 48242540181360 
    b.object_id  #=> 48242540299680 
    

    现在让我们把它们加起来:

    c = a + b    #=> [1, 2, 3, 4] 
    

    这会创建一个新对象(由变量c 持有):

    c.object_id  #=> 48242540315060 
    

    并保持(持有的对象)ab(及其对象 ID)不变:

    a            #=> [1, 2] 
    b            #=> [3, 4]
    

    现在,让我们写:

    a += b       #=> [1, 2, 3, 4]
    

    Ruby 更改为:

    a = a + b
    

    当它编译代码时。我们得到:

    a            #=> [1, 2, 3, 4] 
    a.object_id  #=> 48242541482040
    

    变量a 现在包含一个新对象,该对象等于a 的先前值加上b

    现在让我们将ba 的(新值)连接起来:

    a.concat(b)  #=> [1, 2, 3, 4, 3, 4]  
    

    这会改变(变异a,但当然不会改变a的对象ID:

    a            #=> [1, 2, 3, 4, 3, 4] 
    a.object_id  #=> 48242541482040  
    

    最后,我们可以用c 替换a 的值,而不影响a 的对象ID:

    a.replace(c) #=> [1, 2, 3, 4]
    a            #=> [1, 2, 3, 4] 
    a.object_id  #=> 48242541482040
    

    请参阅Array#+Array#concatArray#replace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-10
      • 2017-03-25
      • 2010-09-06
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      相关资源
      最近更新 更多