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

ruby运算符与铲子混淆(<<)和=,Concating数组,第1张

概述我已经读过<<<<<<< =.但我想我可能无法理解这些差异,因为我的预期代码不会输出我想要实现的内容. 回应 Ruby differences between += and << to concatenate a string 我想把“猫”解读成一个字母/单词的数组 => [“c”,“ca”,“cat”,“a”,“at”,“t”] def helper(word)words_array = [] 我已经读过<<<<<<< =.但我想我可能无法理解这些差异,因为我的预期代码不会输出我想要实现的内容. 回应 Ruby differences between += and << to concatenate a string

我想把“猫”解读成一个字母/单词的数组
=> [“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' }}require 'benchmark'a = ''b= ''puts Benchmark.measure { 100000.times { a << 'test' }}puts Benchmark.measure { 100000.times { b += 'test' }}0 0.120000 ( 0.108534)
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数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1285229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存