Ruby中的模块和类。矛盾?

时间:2013-08-26 07:54:22

标签: ruby class module

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

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

3 个答案:

答案 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”。在这种意义上,这可能意味着什么,所写的内容并不矛盾。