2008-03-02
Ruby and Metaprogramming
J2EE app 一般都有用到 xDoclet 做一些宣告然後再產生程式碼. Java 1.5 開始支援 Annotation 功能來解決這方面需要. 其實 Ruby 拜本身就是 dynamic 語言之賜, 它這方面的方法可就高明多了, 這也就是為何 Rails 看起來又像是 metaprogramming 的原因.
請參考這篇說明, Metaprogramming Ruby
Ruby 不用 setXXX, getXXX, 而是用稱為 attribute accessor 這種方法.
class Book
def initialize(title)
@title = title
end
def title
@title
end
def title=(value)
@title = value
end
end
b = Book.new("Ruby Programming");
puts b.title
b.title = "Ruby Programming 2nd"
puts b.title
更進一步, 可以用 Ruby 來開發你自己的 programming language 一樣, 可以將上面存取 @title 的兩個方法給作掉, Ruby 內建 attr_reader, attr_write, attr_accessor 這幾個 methods 就是為了這個目地. 如此一來, 你就可以把程式改寫為:
class Book
attr_accessor :title
def initialize(title)
@title = title
end
end
b = Book.new("Ruby Programming");
puts b.title
b.title = "Ruby Programming 2nd"
puts b.title
是不是簡單又直覺? 就是提供一些新的 methods, 就可以輕鬆咦髂愕?class. 這就是 Rails 為何都不需用其它檔案來輔助做設定, 利用這些技巧在加上 coding convention, 就很漂亮, 所以不知道 Rails 用法時就是找那些 method 說明就對了.
Showing changes from revision #3 to #4: Added | Removed
J2EE app 一般都有用到 xDoclet 做一些宣告然後再產生程式碼. Java 1.5 開始支援 Annotation 功能來解決這方面需要. 其實 Ruby 拜本身就是 dynamic 語言之賜, 它這方面的方法可就高明多了, 這也就是為何 Rails 看起來又像是 metaprogramming 的原因.
請參考這篇說明, Metaprogramming Ruby
Ruby 不用 setXXX, getXXX, 而是用稱為 attribute accessor 這種方法.
class Book
def initialize(title)
@title = title
end
def title
@title
end
def title=(value)
@title = value
end
end
b = Book.new("Ruby Programming");
puts b.title
b.title = "Ruby Programming 2nd"
puts b.title
更進一步, 可以用 Ruby 來開發你自己的 programming language 一樣, 可以將上面存取 @title 的兩個方法給作掉, Ruby 內建 attr_reader, attr_write, attr_accessor 這幾個 methods 就是為了這個目地. 如此一來, 你就可以把程式改寫為:
class Book
attr_accessor :title
def initialize(title)
@title = title
end
end
b = Book.new("Ruby Programming");
puts b.title
b.title = "Ruby Programming 2nd"
puts b.title
是不是簡單又直覺? 就是提供一些新的 methods, 就可以輕鬆咦髂愕?class. 這就是 Rails 為何都不需用其它檔案來輔助做設定, 利用這些技巧在加上 coding convention, 就很漂亮, 所以不知道 Rails 用法時就是找那些 method 說明就對了.
摘自:EasyTime
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 1196 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
在ASP.NET 2.0中实现URL ...
不知道这样的方式和ISAPI的插件模式,在效率上有什么差别。
-- by 风中独火 -
在ASP.NET 2.0中实现URL ...
<system.web> <urlMappings enabl ...
-- by hunter001201 -
向页面传值接收不到
没人知道吗`````````````````````问题已经解决`````
-- by litoueva






评论排行榜