/****************************************
按名称调用
一切都是对象, 且永不关闭
钩子无处不在
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,不用类名
查询方法要带? , 修改方法要带 !