根据RubyMonk 8.1 节,模块只保存行为而不是状态,类可以保存行为和状态。
然而,模块是 Ruby 中类的超类。怎么会这样?
哦,兄弟,如果你忘记了模块/类实例变量和模块/类方法,你甚至不能说类持有状态——因为持有状态的是类的实例。类包含一个实例方法列表。所以关于课程的整个部分在技术上也是错误的。
底线是 ruby 中 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
模块可以有状态,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
如果您引用的内容确实是该消息来源所说的,那么它缺乏准确性。在准确使用术语的情况下,确实是矛盾的。
但是,人们(不准确地)使用该术语Module
来表示“Module
不是一个Class
”。在这个意义下,大概是什么意思,那里写的并不矛盾。