我正在通过Ruby Koans工作。
about_strings.rb中的test_the_shovel_operator_modifies_the_original_string
Koan包含以下注释:
RubyRubyRuby程序员在构建字符串时倾向于使用
操作符(<<)而不是加号等于操作符(+=)。为什么?
我的猜测是它涉及速度,但我不理解引擎盖下的动作会导致铲子操作员更快。
有没有人能解释一下这个偏好背后的细节?
发布于 2011-01-14 03:46:53
证明:
a = 'foo'
a.object_id #=> 2154889340
a << 'bar'
a.object_id #=> 2154889340
a += 'quux'
a.object_id #=> 2154742560
因此,<<
会更改原始字符串,而不是创建新的字符串。原因是在ruby中,a += b
是a = a + b
的语法简写(其他<op>=
操作符也是如此),这是一种赋值。另一方面,<<
是concat()
的别名,它可以就地更改接收器。
发布于 2011-01-14 04:59:33
性能证明:
#!/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)
发布于 2012-11-21 23:44:21
一个朋友正在学习Ruby作为他的第一种编程语言,他在Ruby Koans系列中学习Ruby中的Strings时也问了我同样的问题。我用下面的类比向他解释;
你有一杯水是半满的,你需要再倒满一杯。
第一种方法是拿一个新的玻璃杯,把水龙头里的水装满一半,然后用第二个半满的玻璃杯重新装满你的饮水杯。每次你需要续杯时,你都会这样做。
第二种方法是把你的半杯水直接从水龙头里倒满。
在一天结束的时候,如果你每次需要续杯时都选择换一个新的玻璃杯,你会有更多的玻璃杯需要清洗。
同样的道理也适用于铁铲运算符和加号相等运算符。另外,equal操作员每次需要重新装满它的杯子时都会选择一个新的‘玻璃杯’,而铲子操作员只是拿着相同的玻璃杯重新装满它。在一天结束的时候,Plus equal运算符有更多的“玻璃”集合。
https://stackoverflow.com/questions/4684446
复制相似问题