Mis*_*hko 22 ruby module include extend
可能重复:
Ruby中包含和扩展有什么区别?
鉴于:
module my_module
def foo
...
end
end
Run Code Online (Sandbox Code Playgroud)
问题1
有什么区别:
class A
include my_module
end
Run Code Online (Sandbox Code Playgroud)
和
class A
extend my_module
end
Run Code Online (Sandbox Code Playgroud)
问题2
将foo被视为实例方法还是类方法?换句话说,这相当于:
class A
def foo
...
end
end
Run Code Online (Sandbox Code Playgroud)
或者:
class A
def self.foo
...
end
end
Run Code Online (Sandbox Code Playgroud)
?
Mau*_*res 28
我很久以前在这里写了一篇关于这个的博客文章.
当你"包含"一个模块时,包含的模块好像方法是在包含它们的类中定义的,你可以说它正在将方法复制到包含类.
当你"扩展"一个模块时,你会说"将这个模块的方法添加到这个特定的实例 ".当你在一个类定义中并说"扩展"时,"实例"就是类对象本身,但你也可以做这样的事情(如我上面的博客文章中所述):
module MyModule
def foo
puts "foo called"
end
end
class A
end
object = A.new
object.extend MyModule
object.foo #prints "foo called"
Run Code Online (Sandbox Code Playgroud)
所以,它不是一个类方法,而是一个"实例"的方法,你称之为"扩展".正如你在类定义中所做的那样,那里的实例就是类本身,它"看起来像"一个类方法.
And*_*man 16
1)include在类的实例上添加方法,常量和变量A; extend将这些东西添加到实例的Class实例中A(有效地定义类方法).
include my_module 将允许这样: A.new.foo
extend my_module 将允许这样: A.foo
更一般地说,include只有在一个Class或有意义Module,而extend可以用于添加任何方法Object.
2)实际上:当使用时include,foo是...的实例方法,A在使用时extend,foo是一个类方法.
| 归档时间: |
|
| 查看次数: |
15673 次 |
| 最近记录: |