新手问题 [新手求助] 学习 Module 时,对其和 Class 区别感到的混淆

gu_bonjour · 2015年05月16日 · 最后由 gu_bonjour 回复于 2015年05月17日 · 3200 次阅读

今天学习到了 Module 这块,因为看到了 Modulue 和 Class 有很多相似的地方,暂时没有搞得很清楚,有几个问题想请教一下:

1.

书中给了一个例子:

module HelloModule1
  Version = "1.0"
  def hello(name)
    puts "Hello," + name
  end
  module_function :hello
end

p HelloModule::Version
HelloModule::hello("Alice")

include HelloModule
p Version
hello("Alice")

在这里针对这段

module_function :hello

文中的解释是: #将 hello 以模组函数式形式公开 本人对这段话的理解是:

def hello(name)
  puts "Hello," + name
end

本来是该 module 下的一个实例方法,在没有生成一个实例前是不能调用或访问的。但是在经过module_function :声明之后,就有点类似一个静态的方法可以直接访问。 不知道这样理解是否正确。

2.

Case1

#Case1
module HelloModule1
  Version = "1.0"
  def hello(name)
    puts "Hello," + name
  end
  module_function :hello
end

p HelloModule::Version
HelloModule::hello("Alice")

include HelloModule
p Version
hello("Alice")

Case2

#Case2
module HelloModule2
  Version = "1.0"
  def hello(name)
    puts "Hello," + name
  end
end

Class SaySth2
include HelloModulu2
end

p SaySth.new.hello

Case3

#Case3
module HelloModule3
  Version = "1.0"
  def self.hello(name)
    puts "Hello," + name
  end
end

class HelloCLass4
  Version = "1.0"
  def self.hello(name)
    puts "Hello," + name
  end
end

Class SaySth3
  extend HelloModulu3
end

Class SaySth4
  extend HelleClass4
end

Case1 和 Case 2 我基本可以理解

Case3 我就彻底对 Module 和 Class 的区别产生了混淆,甚至对includeextend也产生了混淆,求大神笼罩。

https://ruby-china.org/topics/25565 这个贴写得挺好的 你可以看看

Module#include只能在Module实例或Module的subclass的实例中调用,用于mixin Object#extend能在各种object(包括Module、Module实例、普通自定义对象)中调用,用于扩展,在class上则是扩展class method,在自定义对象上则是扩展 instance method 它们都只接收 Module 实例作为参数

#2 楼 @zhang_soledad #1 楼 @springwq 感谢两位!我会去认真拜读!

#3 楼 @theblock24block 好像有点明白了 感谢!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号