根据RubyMonk section 8.1模块,只保持行为而不是状态,类可以保持行为和状态。
然而,模块是Ruby中的超类类。怎么会这样?
答案 0 :(得分:4)
哦兄弟,如果你忘记了模块/类实例变量和模块/类方法,你甚至不能说类保持状态 - 因为它是保持状态的类的实例。类包含实例方法的列表。所以关于课程的整个部分在技术上也是错误的。
底线是红宝石中99.99%的东西是物体,任何物体都可以保持状态。类是对象(以及对象的生成者),模块是对象(但不是对象的生成者),类的实例是对象。
我建议你不要担心国家。只关注模块可以用于两件事的事实:
1)作为命名空间:
module MyFunctions
def MyFunctions.puts(str) #...or: def self.puts(str)
Kernel.puts "***" + str
end
end
puts 'hello'
MyFunctions.puts 'hello'
--output:--
hello
***hello
2)作为要包括的方法包,例如在课堂上:
module AnimalTricks
def speak
puts @noise
end
end
class Dog
include AnimalTricks
def initialize
@noise = "woof"
end
end
class Mouse
include AnimalTricks
def initialize
@noise = "sqeak"
end
end
Dog.new.speak
Mouse.new.speak
--output:--
woof
sqeak
答案 1 :(得分:3)
模块可以有状态,bru
module Foo
@state = "a"
def self.state
@state
end
def self.stateful
@state = "b"
end
end
看!
Foo.state # a
Foo.stateful # b
Foo.state # b
答案 2 :(得分:2)
如果您引用的内容确实是该来源所说的内容,那么它就缺乏准确性。在准确使用这些术语的情况下,确实存在矛盾。
然而,人们(不准确)使用术语Module
来表示“Module
不是Class
”。在这种意义上,这可能意味着什么,所写的内容并不矛盾。