赞 | 0 |
VIP | 0 |
好人卡 | 7 |
积分 | 1 |
经验 | 5012 |
最后登录 | 2014-2-28 |
在线时间 | 163 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 163 小时
- 注册时间
- 2011-11-12
- 帖子
- 56
|
普通情況下 def 定義的是實例方法,當在方法定義時指定了方法接收者(比如 self)時就是在定義單例方法。所以 def a 是 Math 的實例方法,def self.a 是 Math (這個 Module 對象)的單例方法。sin 同時是 Math 的實例方法和單例方法,所以兩種方式調用都可以,但它們卻是兩個不同的方法,元編程修改其中一個不會影響另一個。Object 從 Kernel mixin 的大量方法都是這種形式。
為了避免重複定義兩個相同的方法,你可以用 Module#module_function 將實例方法自定複製一份,並定義為單例方法:- module Math
- def a(s)
- p s
- end
- module_function :a
- end
- class Foo
- include Math
- def bar(s)
- a(s)
- end
- end
- Math.a(1)
- Foo.new.bar(2)
复制代码 |
|