`
oliver_peng
  • 浏览: 44291 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

升级到Ruby 1.9 笔记二

    博客分类:
  • Ruby
阅读更多
Ruby 1.8 的字符串只支持ASCII码,在Ruby 1.9 增加了编码(Encoding)属性,能够支持Unicode. 新的功能有利于Ruby更好的支持国际化,但因为字符串对象被使用的太广泛,新的接口导致很多现有代码的修改。

+ 在Ruby1.8, string[index]会返回index所在位置的ACSII整数值:

irb(main):001:0> "123"[0]
=> 49


在Ruby1.9,string[index]会返回index所在位置的字符串:

irb(main):001:0> "123"[0]
=> "1"


如果你使用字符串保存二进制数据,还希望能够继续用索引来获得index所在位置的字节,可以采用以下方法:

irb(main):002:0> "123".getbyte(0)
=> 49


+ 在Ruby1.8,你可以直接对string[index]赋整数值:

irb(main):002:0> s = "123"
=> "123"
irb(main):005:0> s[1] = 53
=> 53
irb(main):006:0> s
=> "153"


在Ruby1.9, 会抛出异常:

irb(main):003:0> s = "123"
=> "123"
irb(main):004:0> s[1] = 53
TypeError: can't convert Fixnum into String
        from (irb):4:in `[]='
        from (irb):4
        from /usr/local/ruby-1.9.1/bin/irb:12:in `<main>'


可以用新的setbyte方法来赋值:

irb(main):005:0> s.setbyte(1, 53)
=> 53
irb(main):006:0> s
=> "153"


+ 在Ruby 1.8, "%d" % nil 会返回 “0”
在Ruby1.9, "%d" % nil 会导致TypeError异常

+ 如果在你的字符串中有特殊字符会导致无法用这个字符串来构建正则表达式:

irb(main):001:0> s = "\233901234560"
=> "\x9B901234560"
irb(main):003:0> s.encoding
=> #<Encoding:UTF-8>
irb(main):002:0> Regexp.new(s)
RegexpError: invalid multibyte character: /�901234560/
        from (irb):2:in `initialize'
        from (irb):2:in `new'
        from (irb):2
        from /bin/irb:12:in `<main>'


解决办法是采用二进制编码格式(ASCII-8BIT):

irb(main):008:0> new_str = s.force_encoding("ascii-8bit")
=> "\x9B901234560"
irb(main):009:0> Regexp.new(new_str)
=> /�901234560/
irb(main):010:0> 


+ 从MySQL数据库返回的字符串默认是ASCII-8BIT格式,但当你用这个字符串来格式化另一个字符串的时候,如果其中包含特殊字符,就会导致异常。下面手工初始化一个ASCII-8BIT的字符串:

irb(main):010:0> str = String.new
=> ""
irb(main):011:0> str << 233
=> "\xE9"
irb(main):012:0> str.encoding
=> #<Encoding:ASCII-8BIT>
irb(main):014:0> new_str = "%c%s" % [245, str]
Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT
        from (irb):14:in `%'
        from (irb):14
        from /bin/irb:12:in `<main>'


解决办法是首先用String.new构建一个ASCII-8BIT格式的字符串,然后用<<和+运算符:

irb(main):015:0> new_str = String.new
=> ""
irb(main):016:0> new_str << 245
=> "\xF5"
irb(main):017:0> new_str += str
=> "\xF5\xE9"


分享到:
评论
2 楼 sevk 2010-08-07  
#让ruby1.8兼容1.9的写法

if RUBY_VERSION < '1.9'
  p 'do as ruby 1.9'
  #为字符串类添加force_encoding和ord方法
  class String
    unless defined?(String.new.bytesize)
      def bytesize
        self.size
      end
    end
    def force_encoding(s)
      self
    end
    def ord
      self[0]
    end
  end
  #为Hash类添加key方法

  class Hash
    def key(k)
      self.index(k)
    end
  end
  #为数字类添加ord方法
  class Fixnum
    def ord
      self
    end
  end
end

1 楼 skyblue1984 2010-08-05  
好像变复杂了.......

相关推荐

    Programming Ruby 1.9 (3rd edition)和源码

    《Programming Ruby 1.9 (3rd edition)》是一本专为程序员编写的关于Ruby语言的权威指南,这本书的第三版详细介绍了Ruby 1.9版本的语言特性、库以及编程实践。Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的...

    windows下安装Ruby 1.9 二进制zip包

    在Windows环境下安装Ruby 1.9,通常会涉及到编译环境的配置,因为Ruby的源码需要通过编译才能在Windows系统上运行。不过,如果你选择的是预编译的二进制zip包,这个过程就会简化很多。下面,我们将详细讨论如何通过...

    Programming Ruby 1.9

    通过阅读《Programming Ruby 1.9》,读者不仅可以掌握Ruby 1.9的最新特性,还能学习到如何编写高效、简洁的Ruby代码,以及如何利用这些新特性解决实际问题。书中的例子和练习都是为了加深理解和实践应用,对于想要在...

    透视Ruby 1.9的Lambda函数

    《Ruby 1.9中的Lambda函数详解》 Ruby语言的一大魅力在于其Block功能,它使得编写简洁、可复用的算法变得轻而易举,甚至让人们对循环的畏惧感大大降低。Block在其他编程语言中被称为Lambda函数或匿名函数,有时也被...

    为何Ruby 1.9的不兼容性会导致原有Ruby代码无法工作

    Ruby 1.9 的发布对Ruby社区带来了显著的变化,尤其是其与之前的1.8版本之间的不兼容性。这种不兼容性源于对Ruby语言及其核心库的深入修改,目的是提升语言性能和规范。Ruby 1.9.0的推出并非完全稳定,Matz,即Ruby的...

    Programming Ruby 1.9 3rd edition

    ### Programming Ruby 1.9 3rd Edition:深入探索Ruby编程语言 #### 一、书籍概览 《Programming Ruby 1.9》是第三版,专注于介绍Ruby 1.9.2版本,由Dave Thomas、Chad Fowler和Andy Hunt共同编写。这本书由The ...

    ruby 1.9 教程

    - **Ruby 1.9 版本**: 截至2009年,Ruby已发展到1.9版本,这是该语言的一个重要里程碑。Ruby 1.9在性能、语法改进以及新特性方面进行了大量的更新和优化。 - **Ruby 2.0 版本**: Ruby 2.0版本预计将于2010年发布,这...

    Programming Ruby 1.9 & 2.0 The Pragmatic Programmers’ Guide 4th Edition

    Ruby是一种快速发展的激动人心的动态语言,本书是Ruby 1.9和Ruby 2.0这两个最新版本的完整参考指南。Ruby是一种完全面向对象的语言,类似于经典的面向对象语言Smalltalk。与Smalltalk一样,它是动态类型的,但与...

    Programming Ruby 1.9 The Pragmatic Programmers' Guide

    通过阅读《Programming Ruby 1.9 The Pragmatic Programmers' Guide》,读者不仅能掌握Ruby 1.9的语法和特性,还能了解到良好的编程实践和设计模式,提升编程能力和效率。这本书是Ruby初学者和经验丰富的开发者的...

    (ruby 1.9 开发)Rango

    ### Rango:Ruby 1.9 上的轻量级网络开发框架 Rango 是一个基于 Ruby 1.9 的轻量级 Web 开发框架,它为开发者提供了灵活且强大的工具来构建网站。与 Sinatra 相比,Rango 更加健壮;而与 Rails 或 Merb 相比,它的...

    Programming Ruby 1.9 (Pragmatic Bookshelf 2009).pdf

    《Programming Ruby 1.9》涵盖了从基础语法到高级主题的广泛内容,为初学者提供了进入Ruby世界的入口,同时也为有经验的开发者提供了深入理解语言特性的机会。本书不仅是一本详尽的学习指南,也是一份宝贵的参考手册...

    [Ruby] Ruby 1.9 & 2.0 编程 (英文版)

    [Pragmatic Bookshelf] Ruby 1.9 & 2.0 编程 (英文版) [Pragmatic Bookshelf] Programming Ruby 1.9 & 2.0 The Pragmatic Programmers' Guide 4th Edition (E-Book) ☆ 出版信息:☆ [作者信息] Dave Thomas , ...

    Pragmatic.Programming.Ruby.1.9.Apr.2009.pdf

    《实用的Ruby编程:针对Ruby 1.9的程序员指南》不仅是一本详尽的Ruby语言教程,也包含了丰富的编程技巧和最佳实践,适合从初学者到有经验的开发人员各个层次的读者。通过学习本书,读者可以全面掌握Ruby 1.9的核心...

    学习Ruby的笔记以及Demo源码.zip

    学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及...

    Pragmatic.Programming.Ruby.1.9

    Ruby是一种简洁、高效且易于学习的动态编程语言,它以其简洁的语法和强大的功能受到广大开发者的喜爱。1.9版本是Ruby的一个重要里程碑,引入了许多新特性,包括性能改进、新的字符串处理方式等。 #### 描述解析:...

    Ruby编程语言_涵盖Ruby 1.8和1.9

    2. 元编程:Ruby的强大之处在于其内置的元编程能力,允许在运行时修改和创建类及对象。 3. 动态性:Ruby的动态性意味着可以在程序运行过程中改变类的行为,增加了代码的灵活性。 4. 块和闭包:Ruby的块和闭包提供了...

Global site tag (gtag.js) - Google Analytics