Ruby學習筆記-1
最近在學習Ruby這個程式語言, 學到現在覺得這個程式語言與我常用的ObjectiveC有許多相似性, 所以在這邊做個摘要整理 多重繼承的解決方案: 松本行弘在這本書裡面比較了C++, Java等程式語言的多重繼承問題, Ruby是使用Mix-in來實現多重繼承, 那麼ObjectiveC呢? 以我觀察, ObjectiveC是使用Protocol來實現多重繼承, 而且ObjectiveC的protocol與Ruby的Mix-in的概念幾乎一模一樣, 但是不太一樣的是Ruby使用Module來宣告Mix-in的介面與實作, 而ObjectiveC僅使用@protocole來宣告protocole的介面, 實作上必須在使用這個protocol的Class來實作, Mix-in是將許多物件的共同行為抽象化, 但是這些物件並不一定是繼承至共同的類別. 從C語言的觀點, Mix-in可以當做是共用的Module, 或是static function. ObjectiveC的protocol可以為既定的類別衍生出介面, 並可在run time來判斷與呼叫, 所以不同類別的物件也可以擁有同樣的Protocol. 從以上比較, Protocol無法做到實作的抽象化與重複使用, 這應該是跟Ruby本身是動態型別支援有關. Protocol也許也可以做到, 但是要花一些工, 作法也許類似要在Protocol中去使用抽象類別衍生的物件, 這方面的技巧跟C++ abstraction class與Java interface應該是一樣的
Metaprogramming: Ruby可使用語法來動態產生方法, 在ObjectiveC 2.0也有類似的語法, 就是property, 使用property可以省下許多寫setter與getter的物件存取方法的code, Ruby則使用了attr_accessor. Metaprogramming還有許多用法例如Reflection, Reflection我也是最近兩年才知道的技術, 並沒有太多使用經驗, Java, ObjectiveC都有支援
動態型別: ObjectiveC與Java都是靜態型別程式語言,必須嚴格指定變數型別, 在編譯時可指出錯誤的型別指定錯誤, Ruby則沒有這種限制, 但是Ruby會在runtime時去做型別判斷