我想把“猫”解读成一个字母/单词的数组
=> [“c”,“ca”,“cat”,“a”,“at”,“t”]
def helper(word)words_array = []IDx = 0while 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_arrayendhelper("cat")
我不明白为什么
温度<<字[j]的
与temp = word [j]不同,对我而言,我在这个特定情况下的逻辑是正确的.
require 'benchmark'a = ''b= ''puts Benchmark.measure { 100000.times { a << 'test' }}puts Benchmark.measure { 100000.times { b += 'test' }}
产量
总结更新
我原本误解了这个问题.这是最近发生的事情. Ruby变量只存储对象的引用,而不是对象本身.这里的简化代码与您的代码完全相同,并且具有相同的问题.我告诉它在循环的每次迭代中打印temp和words_array.
这是它打印的内容:
正如您所看到的,在内部循环的第一次迭代之后,ruby只是替换words_array的最后一个元素.这是因为words_array持有对temp引用的字符串对象的引用,并且<<修改该对象而不是创建新对象.在外循环的每次迭代中,temp被设置为一个新对象,并且该新对象被附加到words_array,因此它不会替换先前的元素.=构造在内循环的每次迭代中向temp返回一个新对象,这就是它的行为与预期一致的原因.
0.000000 0.000000 0.000000 ( 0.004653)0.require 'benchmark'a = ''b= ''puts Benchmark.measure { 100000.times { a << 'test' }}puts Benchmark.measure { 100000.times { b += 'test' }}
0 0.
require 'benchmark'a = ''b= ''puts Benchmark.measure { 100000.times { a << 'test' }}puts Benchmark.measure { 100000.times { b += 'test' }}require 'benchmark'a = ''b= ''puts Benchmark.measure { 100000.times { a << 'test' }}puts Benchmark.measure { 100000.times { b += 'test' }}0 0.120000 ( 0.108534)require 'benchmark'a = ''b= ''puts Benchmark.measure { 100000.times { a << 'test' }}puts Benchmark.measure { 100000.times { b += 'test' }}
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_arrayendp helper("cat")temp: cwords: ["c"]temp: cawords: ["ca"]temp: catwords: ["cat"]temp: awords: ["cat","a"]temp: atwords: ["cat","at"]temp: twords: ["cat","at","t"]["cat","t"]
以上是内存溢出为你收集整理的ruby运算符与铲子混淆(<<)和=,Concating数组全部内容,希望文章能够帮你解决ruby运算符与铲子混淆(<<)和=,Concating数组所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)