gpt4 book ai didi

ruby 运算符与铲子 (<<) 和 += 混淆,连接数组

转载 作者:数据小太阳 更新时间:2023-10-29 07:26:42 25 4
gpt4 key购买 nike

我读过<< += 之间的一些区别。但我想我可能不理解这些差异,因为我预期的代码没有输出我想要实现的。

回应Ruby differences between += and << to concatenate a string

我想将“Cat”解读为它的字母/单词数组=> ["c", "ca", "cat", "a", "at", "t"]

def helper(word)
words_array = []
idx = 0
while idx < word.length
j = idx
temp = ""
while j < word.length
**temp << word[j]**
words_array << temp unless words_array.include?(temp)
j += 1
end
idx += 1
end
p words_array
end
helper("cat")

我不明白为什么温度<<字[j]不同于 temp += word[j] 对我而言,我在这种特定情况下的逻辑是正确的。

最佳答案

一个区别是因为<<工作到位它比+=快一点.以下代码

require 'benchmark'

a = ''
b= ''

puts Benchmark.measure {
100000.times { a << 'test' }
}

puts Benchmark.measure {
100000.times { b += 'test' }
}

产量

0.000000   0.000000   0.000000 (  0.004653)
0.060000 0.060000 0.120000 ( 0.108534)

更新

我最初误解了这个问题。这是怎么回事。 Ruby 变量只存储对对象的引用,而不是对象本身。这是简化的代码,它与您的代码做同样的事情,并且有同样的问题。我告诉它打印 tempwords_array在循环的每次迭代中。

def helper(word)
words_array = []

word.length.times do |i|
temp = ''
(i...word.length).each do |j|
temp << word[j]
puts "temp:\t#{temp}"
words_array << temp unless words_array.include?(temp)
puts "words:\t#{words_array}"
end
end

words_array
end

p helper("cat")

这是它打印的内容:

temp:   c
words: ["c"]
temp: ca
words: ["ca"]
temp: cat
words: ["cat"]
temp: a
words: ["cat", "a"]
temp: at
words: ["cat", "at"]
temp: t
words: ["cat", "at", "t"]
["cat", "at", "t"]

如您所见,在第一次内循环之后的每次迭代中,ruby 只是简单地替换了 words_array 的最后一个元素。 .那是因为 words_array持有对 temp 引用的字符串对象的引用, 和 <<就地修改该对象,而不是创建新对象。

在外循环的每次迭代中 temp设置为一个新对象,并且该新对象附加到 words_array , 所以它不会替换之前的元素。

+=构造返回一个新对象给temp在内循环的每次迭代中,这就是它按预期运行的原因。

关于ruby 运算符与铲子 (<<) 和 += 混淆,连接数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com