简介: 假设您是一名 C++ 开发人员,您需要使用 Ruby 快速执行一些原型设计。当您拿起一本 Ruby 参考书籍(比如 Pickaxe)或浏览 Ruby 网站时,会看到一些熟悉的构造,比如类声明、线程支持和异常处理。正当您认为自己了解 Ruby 的工作原理之时,您意识到了,您 Ruby 代码中的并发机制与 Boost 线程工作原理不一样,catch 和 throw 也与它们看上去的大不相同,而且其他人在其 Ruby 脚本中各处使用了名为 self 的关键词。欢迎来到 Ruby 的世界中!
如果您是一名 C++ 程序员且需要在 Ruby 环境中工作,那么您有一些功课要做。本文讨论了 Ruby 新手可能会误解的六个 Ruby 特性,特别是当他或她来自一个类似但又不太相同的环境,比如 C++:
● Ruby 类层次结构
● Ruby 中的单例方法
● self 关键词
● method_missing 方法
● 异常处理
● 线程
注意:本文中所有的代码均进行测试,且基于 Ruby 版本 1.8.7。
Ruby 中的类层次结构
Ruby 中的类层次结构会很棘手。创建一个 Cat 类型的类并开始探讨其层次结构(参见 清单 1)。
清单 1. Ruby 中的隐式类层次结构
irb(main):092:0> class Catirb(main):093:1> end=> nil irb(main):087:0> c = Cat.new=> #<Cat:0x2bacb68>irb(main):088:0> c.class=> Catirb(main):089:0> c.class.superclass=> Objectirb(main):090:0> c.class.superclass.superclass=> nilirb(main):091:0> c.class.superclass.superclass.superclassNoMethodError: undefined method `superclass' for nil:NilClass from (irb):91 from :0
Ruby 中的所有对象(甚至用户定义的对象)都是 Object 类的后代,这在清单 1 中清晰可见。这与 C++ 是鲜明的对比。这一点也不像普通数据类型,例如 C/C++ int 或 double。清单 2 显示了整数 1 的类层次结构。
清单 2. 整数 1 的类层次结构
irb(main):100:0> 1.class=> Fixnumirb(main):101:0> 1.class.superclass=> Integerirb(main):102:0> 1.class.superclass.superclass=> Numericirb(main):103:0> 1.class.superclass.superclass.superclass=> Object
到目前为止一切顺利。现在您知道了类本身是 Class 类型的对象。而 Class 最终派生自 Object,如 清单 3 中所示使用 Ruby 内置的 String 类。
清单 3. 类的类层次结构
irb(main):100:0> String.class=> Classirb(main):101:0> String.class.superclass=> Moduleirb(main):102:0> String.class.superclass.superclass=> Object
Module 是 Class 的基类,但是使用它时有一点要注意,即您不能直接实例化用户定义的 Module 对象。如果您不想深入 Ruby 内部,最好考虑与 C++ 命名空间有类似特征的 Module:您可以定义您自己的方法、常量、等等。您在 Class 中包含了一个 Module,以及 voilà,Module 的所有元素现在会魔法般地成为 Class 的元素。清单 4 提供了一个示例。
新闻热点
疑难解答