The Ruby Programming Language Notes

/****************************************

按名称调用

一切都是对象, 且永不关闭

钩子无处不在

yield/block/proc/lambda, 一等公民

符号与哈希

模块/类/实例, 随意组装

****************************************/

 

关于风格

 

不会区分什么 primitive type 和 class type

类和对象永不关闭, 你可以随时为现存的类添加各种方法, 让其表达能力/可读性更强 (3.hours 而不是 Time.hours(3))

符号, 完美的标识

哈希表字面构造, 模拟命名参数

简约而不简单, 数组和哈希几乎主宰一切.

参数列表, 括号可省略

Block参数, 就地扩展, 无需继承或定义单独的函数. (消除了 Java 中匿名内部类的需要)

Proc是一级公民, 对象式和函数式的完美结合

 

关于动态

 

按名称调用, Duck Typing, 而不是按类型: 我接触的两种动态语言 Python和Ruby 都是这个样子的. 继承在这类语言中彻底沦为代码复用的一种可选手段, 而不是什么面向对象的核心机制. 面向对象的本质特征其实就是一个多态.

按名称调用, 就是运行时的泛型. (从C++程序员的观点来看)

类和对象永不关闭, 你可以随时为你的类和对象添加它原本不支持的行为

执行过程中的钩子, 关键的步骤你都可以钩入你的代码. 最广泛使用的 method_missing.

任何语句几乎都是函数调用, 都在运行时被解释.

解释器级别的原语, 如 send(:method_name), response_to?(:method_name), block_given? frozen? 等

解释器级别的知识, 或元数据, 关于对象的一切信息

任何已有函数都可以重定义, 包括操作符. (全局范围内的影响, 最好不要重定义核心类的方法)

 

关于结构

 

类和对象永不关闭

用模块对概念/能力/行为建模, 用模块来组装类.

模块, 其实就是泛型算法. (从C++程序员的观点来看)

Duck Typing, 就是 模板 中的 Concept, 对参数在"能力"方面而不是"类型"方面的要求 (从C++程序员的观点来看)

container/iterator/block, 与 STL 的 container/iterator/functor 类似, 只不过一个是语言级别的支持, 一个是类库级别的支持, 一个是与生俱来, 一个是后天发明, 对使用者的影响也是差别巨大, 只能说STL来的太晚了

在动态语言中, 类型只是设计时组织代码逻辑, 对问题建模的一种方式, 运行时则无关紧要. 传统的接口, 面向对象的核心概念之一, 变得可有可无. 原先的接口继承和实现继承, 也只剩实现继承在发挥作用, 而 mixin, 则相当于多重实现继承的实现.

继承在异常体系中发挥作用, 是因为有时只需要 rescue 整个层次. (关于异常处理, 没有其它的方法来代替继承吗?)

 

其它

 

.freeze, const, 完全自动化的unmodifiedList, unmodifiedMap...

method(:method_name), instance_method(:method_name), 获取函数指针, 然后绑定到不同对象.

protected, private 是控制到对象的

Proc 和 lambda. 目前的版本, Proc 和 lambda 都是闭包, 但Proc里面的return, 像 C/C++ 中的Macro中的return, 会跳出调用者函数体.

并行赋值 a, b = b, a

默认参数可引用前面参数

Range, 曾被收录于<<分析模式>>, 估计被实现了无数次, Ruby终于内建支持

yield: 用来实现 Iterator, Template Method

block, proc, lambda: 可用作 Command, Strategy 的载体

赋值语句的值总是参数的值, 而不是方法的返回值

不会自动为属性赋值函数加self.前缀, 只会把它当作局部变量

 

惯用法

 

使用以符号为key的hash做参数, 以便模拟 keyword argument

类内优先使用self,不用类名

查询方法要带? , 修改方法要带 !

阅读更多
上一篇用Netbeans6创建Web Service
下一篇TCP/IP详解 卷一 笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭