`

ruby中的"+="操作符和"<<"操作符

    博客分类:
  • Ruby
 
阅读更多
转自: http://lgn21st.iteye.com/blog/166115

如果你有使用其他语言的习惯,在ruby中你可能会用"+="操作符来appanding字符串.

>> str = "foo"
=> "foo"
>> str += "bar"
=> "foobar"


但是我有充分的理由建议你用"<<"来appanding.也许你没有注意到,当执行"+="操作一个字符串时,你得到的结果其实是一个新创建的String实例来保存结果,但是"<<"操作将直接将在原来的字符串上appanding新字符串:

>> str = "foo"
=> "foo"
>> str.object_id
=> -606274188
>> str += "bar"
=> "foobar"
>> str.object_id
=> -606283808
>> str << "foobar"
=> "foobarfoobar"
>> str.object_id
=> -606283808


"<<"操作符同样可以对Array进行操作,但是请小心不要对Fixnum/Bignum进行"<<"操作,虽然Fixnum/Bignum是对象,但实际上里面存储的是对象的数值,这时请用"+=",如果你用"<<"来操作Fixnum/Bignum,那么将直接对Fixnum/Bignum的位进行操作.


--------- 后记 ---------
关于两种操作符的性能比较,用一个简单的Benchmark来测试

require 'benchmark'

Benchmark.bm do |x|
 str1, str2 = "",""
 x.report("op:+=") do
   30000.times do
     str1 += "foobar"
   end
 end

 x.report("op:<<") do
   30000.times do
     str2 << "foobar"
   end
 end
end

在我的电脑上
在我的电脑上(PentiumM 1.8G, 1.5GMemory, Ubuntu 7.10, ruby 1.8.6)
     user     system      total        real
op:+=  3.420000   0.340000   3.760000 (  5.073756)
op:<<  0.030000   0.000000   0.030000 (  0.033593)

执行30k次字符串appanding操作,结果显示"<<"操作符的速度比"+="操作符快了不止一个数量级,而且我还观察到一个有趣的现象,如果修改appanding执行的次数(比如50k),那么"+="操作的耗时成指数增长而"<<"则一直保持线性增长.其原因是"+="操作符在执行多次后,每次创建新的字符串对象时均需要消耗大内存用于拷贝前一次生成的大字符串对象.
分享到:
评论

相关推荐

    Ruby使用心得汇总——寻找高效的实现

    `&lt;&lt;`操作符通常比`+`操作符更快,因为它直接在字符串内部进行操作,而`+`则会创建新的字符串对象,这在循环中可能导致大量的内存分配和垃圾回收,降低程序性能。如上文所示,使用`&lt;&lt;`比`+=`在连接100000次字符串时快...

    Ruby中对一元操作符重载实例

    今天我们要探讨一下Ruby中的一元操作符重载。 一元操作符有:+ – * ! & 等,为了避免与数值的 + – 混淆,重载一元操作符,要在后面加上一个 @ 操作符。 1. 一个简单的一元操作符重载例子:-@ 操作符 我们以String...

    在Swift中优雅的iOS表单生成器.zip

    在上面的代码中,`FormViewController`是Eureka提供的基础视图控制器,`+++`操作符用于向表单中添加`Section`,`TextRow`表示文本输入行。通过设置`row.title`和`row.placeholder`,我们可以定义表单的显示内容。 ...

    详解Ruby当中的算数运算

    `操作符用于检查某个表达式是否已定义。它可以用来检测变量、方法、`super`调用或`yield`是否存在。例如,`defined? foo`会返回"local-variable"如果foo已被初始化,否则返回`nil`。 最后,双冒号`::`运算符允许...

    Ruby中ERB模板的使用

    在这个例子中,`@title`和`@username`是Ruby对象的实例变量,它们将在运行时被替换为实际的值。ERB引擎会执行这些Ruby代码并替换占位符。 接下来,让我们看看如何在Ruby程序中使用ERB。首先,你需要引入`erb`库: ...

    开放Ruby+watir 自动化测试工具介绍+安装说明

    Ruby和Watir(Web Application Testing in Ruby)是一个强大的自动化测试框架,主要用于Web应用程序的测试。Ruby是一种面向对象的、动态的编程语言,以其简洁、优雅的语法和强大的元编程能力而受到开发者的喜爱。...

    循环打图案

    在C++中,我们可以用类似的方法,但需要处理更多的细节,如换行符和标准输出: ```cpp #include &lt;iostream&gt; void printPyramid(int n) { for(int i = 0; i &lt; n; ++i) { for(int j = 0; j &lt; n - i - 1; ++j) std...

    使用Ruby来处理文本的教程

    例如,连接字符串可以通过使用乘法运算符`*`来实现字符串的重复,使用加号`+`来拼接字符串,或者使用`&lt;&lt;`操作符来追加字符串。 ```ruby str = "The world for a horse" puts str * 2 # 输出: The world for a ...

    ruby 标准库

    在Ruby的标准库中,`Array`类提供了丰富的实例方法和类方法来处理数组。 ##### 1.1 Class methods **1.1.1 []** 用于创建一个新的数组。例如: ```ruby arr = [1, 2, 3] ``` **1.1.2 new** 创建一个新数组。...

    ruby元编程.pdf

    10. 重载运算符和方法:Ruby允许程序员对操作符和方法进行重载,以提供更加面向对象的语法糖。例如,通过重载操作符 `&lt;&lt;`,可以使自定义类的实例支持 `push` 方法。 本书作为填补了语言参考手册和编程食谱书之间的...

    ruby中的双等号==问题详解

    在Ruby语言中,提供了四种比较操作符:`equal?`, `eql?`, `==`, 和 `===`。这些操作符在不同场景下的使用可能会产生不同的结果,特别是在处理不同类的对象时尤其需要注意。本文主要聚焦于`==`操作符的使用及其潜在的...

    Ruby 基本语言介绍

    Ruby 支持使用正则表达式进行字符串匹配和替换等操作,这在文本处理中非常有用。例如: ```ruby text = "Hello, my name is John." match = text.match(/name is (\w+)/) puts match[1] # 输出 "John" ``` #### 三...

    ruby语言帮助文档(简体中文)

    方法调用可以用点操作符(`.`)或者下划线操作符(`_`),并且支持块(block)和 Proc 对象,这对于迭代和回调非常有用。 4. **控制结构**:Ruby有各种控制结构,包括条件语句(if/else/unless)、循环(for、while、...

    ruby准备资料ruby准备资料

    在“ruby准备资料”中,我们可以关注几个关键概念:操作符重载、闭包和迭代器,这些都是Ruby编程中的核心概念。 1. **操作符重载(Operator Overloading)** Ruby允许程序员为自定义类定义操作符的行为,这意味着...

    Ruby程序设计语言 (涵盖Ruby 1.8和1.9)源代码

    《Ruby程序设计语言》是Ruby的权威指南,全面涵盖该语言的1.8版和1.9版。本书详尽但并不拘泥于语言规范,既适合首次... 表达式和操作符  语句和控制结构  Method、proc、lambda和closure  类和模块  反射和元编程

    Ruby语言中文教程.rar

    继承是类之间的一种关系,使用`&lt;`操作符实现,如`class Child &lt; Parent`表示Child类继承自Parent类。多态性在Ruby中通过消息传递实现,即对象调用方法,如果该方法不存在,会尝试在父类中查找。 Ruby中的控制结构...

Global site tag (gtag.js) - Google Analytics