2

根据RubyMonk 8.1 节,模块只保存行为而不是状态,类可以保存行为和状态。

然而,模块是 Ruby 中类的超类。怎么会这样?

4

3 回答 3

4

哦,兄弟,如果你忘记了模块/类实例变量和模块/类方法,你甚至不能说类持有状态——因为持有状态的是类的实例。类包含一个实例方法列表。所以关于课程的整个部分在技术上也是错误的。

底线是 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
于 2013-08-26T08:45:00.530 回答
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
于 2013-08-26T08:27:58.603 回答
2

如果您引用的内容确实是该消息来源所说的,那么它缺乏准确性。在准确使用术语的情况下,确实是矛盾的。

但是,人们(不准确地)使用该术语Module来表示“Module不是一个Class”。在这个意义下,大概是什么意思,那里写的并不矛盾。

于 2013-08-26T07:57:01.630 回答