认识六个被误解的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=> nilirb(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 提供了一个示例。

清单 4. Module 不能进行直接实例化,并且只能与类一同使用

irb(main):020:0> module MyModuleirb(main):021:1> def helloirb(main):022:2> puts "Hello World"irb(main):023:2> endirb(main):024:1> endirb(main):025:0> test = MyModule.newNoMethodError: undefined method `new' for MyModule:Module from (irb):25irb(main):026:0> class MyClassirb(main):027:1> include MyModuleirb(main):028:1> end=> MyClassirb(main):029:0> test = MyClass.new=> #<MyClass:0x2c18bc8>irb(main):030:0> test.helloHello World => nil

下面再重申一下重点:当您使用 Ruby 编写 c = Cat.new 时,c 是派生自 Object 的 Cat 类型的一个对象。Cat 类是 Class 类型的一个对象,Class 派生自 Module,而 Module 又派生自 Object。因此该对象及其类型都是有效的 Ruby 对象。

时间: 2024-06-11 19:23:11

认识六个被误解的Ruby特性的相关文章

六个最酷的 Ruby on Rails 项目

Ruby on Rails(简称Rails)是松本行弘Ruby编写的纯面向对象编程语言,目的是让程序开发人员专注于编程最有趣最有创造力的部分.如今Rails已经是最火(薪水最高)的web应用开发语言之一,而且Rails还是开源的,拥有4200个开源代码贡献者,因此Rails在不断进化完善中.就流行而言,Ruby on Rails目前在HotFrameworks排名第三. Ruby on Rails为什么会这么火?下面我们列举用Rails开发的六个很酷的项目,也许你会对Rails的强大有一个直观的

用实际代码演示Ruby的容易被误解的6个特性_ruby专题

简介: 假设您是一名 C++ 开发人员,您需要使用 Ruby 快速执行一些原型设计.当您拿起一本 Ruby 参考书籍(比如 Pickaxe)或浏览 Ruby 网站时,会看到一些熟悉的构造,比如类声明.线程支持和异常处理.正当您认为自己了解 Ruby 的工作原理之时,您意识到了,您 Ruby 代码中的并发机制与 Boost 线程工作原理不一样,catch 和 throw 也与它们看上去的大不相同,而且其他人在其 Ruby 脚本中各处使用了名为 self 的关键词.欢迎来到 Ruby 的世界中! 如

六个对CRM大数据分析至关重要的特性

在当今经济环境中,良好的客户服务和http://www.aliyun.com/zixun/aggregation/11358.html">客户体验至关重要.越来越多的企业通过挖掘客户数据提升客户关系,了解客户需求. 今天的CRM数据分析能力已经不止局限于客户邮件.电话等数据,而是能够识别客户购买行为,了解客户情绪. 接下来介绍六个对CRM至关重要的特性 有意义的洞察力和报表.今天,销售人员需要与客户保持密切的联系,需要了解客户最近的活动,尤其是购买了什么产品.销售人员需要容易地获得这些信息

六个对CRM数据分析至关重要的特性

在当今经济环境中,良好的客户服务和客户体验至关重要.越来越多的企业通过挖掘客户数据提升客户关系,了解客户需求. 今天的CRM数据分析能力已经不止局限于客户邮件.电话等数据,而是能够识别客户购买行为,了解客户情绪. 接下来介绍六个对CRM至关重要的特性: 有意义的洞察力和报表.今天,销售人员需要与客户保持密切的联系,需要了解客户最近的活动,尤其是购买了什么产品.销售人员需要容易地获得这些信息,以免错过重要内容. 对客户及需求的整体把握.在某些情况下,数据能够揭示顾客的需求,以及接下来的购买计划.这

在Ruby中对字符串和block求解

介绍 对包含代码的字符串和block求解,是我最钟爱的Ruby特性之一.Ruby提供了多种不同类型的求解方式:不过我最常用的是下面这些:eval.instance_eval和class_eval. Module.class_eval 使用Module类的class_eval(及其别名module_eval)方法,可以在一个类的定义或者module定义的上下文中对给定字符串或block进行求解.我们常常用class_eval来向类的定义中加入方法,或是包含其他的module. klass = Cl

css特性:空白外边距互相叠加

白双边距是一个极容易误解的CSS特性.它不是CSS的bug,但如果我们一旦误解,将会给你带来很多麻烦. 先看如下demo代码: <!doctype html><html><head><meta charset="utf-8"><title>空白边距叠加demo@Mr.Think</title><style> body{width:300px; font-family:'微软雅黑'; font-size:

RocketMQ 关键特性

Apache RocketMQ之所以能在众多的消息中间件中脱颖而出,能吸引数千企业用户与RocketMQ的关键特性是分不开的,本文详细介绍RocketMQ中的关键特性. 一.过万的单机队列数 诸如Kafka之类的消息中间件,在队列数上升时性能会产生巨大的损失,RocketMQ之所以能单机支持上万的持久化队列与其独特的存储结构分不开. 如上图所示,所有的消息数据单独存储到一个Commit Log,完全顺序写,随机读.对最终用户展现的队列实际只存储消息在Commit Log的位置信息,并且串行方式刷

《Effective Ruby:改善Ruby程序的48条建议》一第1章 让自己熟悉Ruby

第1章 让自己熟悉Ruby像你所学的每门程序设计语言一样,深入发掘它的特性是很重要的,从这点上来说Ruby也没有什么不同.Ruby是由很多语言发展而来的,它在借鉴了这些语言的很多特性的同时,也有自己处理问题的方式.有时候这些方式会让你惊讶万分.我们的Ruby特性学习之旅从检验其独特展现常见的编程思想这个方面开始.也就是说,这些特性会影响编程的每一部分.掌握了这些特性,你将为学习之后的章节做好准备.

跨越边界: 活动记录和Java编程中特定于域的语言

DSL 是专门解决特定于域问题的语言.通过更接近问题的操作,DSL 可以提供在通用语言中可能找不 到的好处.Java 世界中充满了 DSL.属性文件.Spring 上下文.标注的某种用法以及 Ant 任务,都是 DSL 的示例. 在开始研究其他像 Ruby 这样的语言的时候,我开始理解到 Java 语言目前对于 DSL 还没有良好的把 握.在这篇文章中,将看到 Ruby 使用的四种集成干净的 DSL 的技巧.然后,将看到在 Java 语言中可 能存在的选项是什么. 隐藏语言的世界 虽然您可能不知