文章目錄
/****************************************
按名稱調用
一切都是對象, 且永不關閉
鉤子無處不在
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,不用類名
查詢方法要帶? , 修改方法要帶 !