首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Ruby语言中构建字符串时,首选的是铲运算符(<<)而不是加号(+=)?

为什么在Ruby语言中构建字符串时,首选的是铲运算符(<<)而不是加号(+=)?
EN

Stack Overflow用户
提问于 2011-01-14 03:40:43
回答 7查看 33K关注 0票数 167

我正在通过Ruby Koans工作。

about_strings.rb中的test_the_shovel_operator_modifies_the_original_string Koan包含以下注释:

RubyRubyRuby程序员在构建字符串时倾向于使用

操作符(<<)而不是加号等于操作符(+=)。为什么?

我的猜测是它涉及速度,但我不理解引擎盖下的动作会导致铲子操作员更快。

有没有人能解释一下这个偏好背后的细节?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-01-14 03:46:53

证明:

代码语言:javascript
复制
a = 'foo'
a.object_id #=> 2154889340
a << 'bar'
a.object_id #=> 2154889340
a += 'quux'
a.object_id #=> 2154742560

因此,<<会更改原始字符串,而不是创建新的字符串。原因是在ruby中,a += ba = a + b的语法简写(其他<op>=操作符也是如此),这是一种赋值。另一方面,<<concat()的别名,它可以就地更改接收器。

票数 274
EN

Stack Overflow用户

发布于 2011-01-14 04:59:33

性能证明:

代码语言:javascript
复制
#!/usr/bin/env ruby

require 'benchmark'

Benchmark.bmbm do |x|
  x.report('+= :') do
    s = ""
    10000.times { s += "something " }
  end
  x.report('<< :') do
    s = ""
    10000.times { s << "something " }
  end
end

# Rehearsal ----------------------------------------
# += :   0.450000   0.010000   0.460000 (  0.465936)
# << :   0.010000   0.000000   0.010000 (  0.009451)
# ------------------------------- total: 0.470000sec
# 
#            user     system      total        real
# += :   0.270000   0.010000   0.280000 (  0.277945)
# << :   0.000000   0.000000   0.000000 (  0.003043)
票数 84
EN

Stack Overflow用户

发布于 2012-11-21 23:44:21

一个朋友正在学习Ruby作为他的第一种编程语言,他在Ruby Koans系列中学习Ruby中的Strings时也问了我同样的问题。我用下面的类比向他解释;

你有一杯水是半满的,你需要再倒满一杯。

第一种方法是拿一个新的玻璃杯,把水龙头里的水装满一半,然后用第二个半满的玻璃杯重新装满你的饮水杯。每次你需要续杯时,你都会这样做。

第二种方法是把你的半杯水直接从水龙头里倒满。

在一天结束的时候,如果你每次需要续杯时都选择换一个新的玻璃杯,你会有更多的玻璃杯需要清洗。

同样的道理也适用于铁铲运算符和加号相等运算符。另外,equal操作员每次需要重新装满它的杯子时都会选择一个新的‘玻璃杯’,而铲子操作员只是拿着相同的玻璃杯重新装满它。在一天结束的时候,Plus equal运算符有更多的“玻璃”集合。

票数 79
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4684446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档