文档章节

Ruby中模块导入 以及include和extend的区别

穿山
 穿山
发布于 2017/11/08 11:00
字数 503
阅读 53
收藏 0
module MathMatica
  PI = 3.14
  def self.clazz_fun
    puts "模块可以使用类方法"
  end
  #模块因为无法实例化所以用不了实例方法
  def hello
    puts "模块中的实例方法"
  end
end
#模块直接调用常量
puts MathMatica::PI
#模块使用类方法
puts MathMatica.clazz_fun
#需要使用这个模块时候将这个模块导入进来称为Mix-in
class Student
  attr_accessor :name, :old, :sex
  include MathMatica#把模块注入目标类或者模块作为实例方法
  extend MathMatica#把模块注入目标类或者模块作为类方法
  class << self
    def clazz_fun2
      puts "Student类中的类方法"
    end
  end
  def initialize(name, old, sex)
    @name = name
    @old = old
    @sex = sex
  end

  def say_hi
    puts "类的实例方法"
    hello#类中使用include导入可以使用模块的实例方法
    self.hello
    # self.clazz_fun2
    # clazz_fun2 实例方法中不能调用类方法
  end
end
Student.clazz_fun2 #类可以调用类方法
Student.hello
puts Student::PI #类可以使用模块中的常量
# Student.clazz_fun
# Student.say_hi#实例不能调用类方法
s = Student.new("huge", 20, "女")
s.say_hi
s.hello
# s.clazz_fun2 Obj不能调用类方法

1 模块是类Class的父类。

2 模块是不可以被new的,也就是说模块不能被实例化,所以模块是没有实例方法的。

3 模块可以直接调用自己的类方法和自己的常量

4 如果一个类需要使用模块的时候可以通过include和extend导入,此过程称之为Mix-in

5 include和extend的区别,使用include导入模块时模块中的类方法可以在类中被当作实例方法,

使用extend导入模块,模块中的类方法在被导入的类中也被当作是类方法。

6 被导入模块中的类可以使用模块的常量和方法(方法以实例方法来使用还是以类方法来使用取决于导入时使用用include还是用extend导入)

7 类不能使用实例方法,Obj不能使用类方法

 

© 著作权归作者所有

穿山
粉丝 9
博文 33
码字总数 18655
作品 0
南京
私信 提问
ruby类方法ClassMethod&实例方法InstanceMethod小结

ClassMethod就是可以MyClass.method的类方法 InstanceMethod就是可以MyClass.new.method的实例方法 1.最正常在类里面定义的是 #定义class MyClassdef self.class_methodputs "self.class_me......

阿昭
2011/08/04
1K
0
理解 Ruby 2.0 中方法是如何查找与执行

预先介绍Ruby2.0是一个好的机会去回顾如何精确的用Ruby去树立方法调用。 理解查找方法对于掌握Ruby的层次类是很有必要的。我准备的这篇文章有很多的代码例子;你需要用Ruby 1.9.2 或者 更新的...

Wyatt
2013/03/24
1K
6
Ruby 模块(Mix-in)

是 Ruby的特色功能之一. 如果说类表现的是实物的实体(数据)及其行为(处理), 那么模块表现的就只是事物的行为部分. 模块与类有以下两点不同: 模块不能拥有实例 模块不能被继承 利用 Mix-in 扩...

changsanjiang
2017/10/23
0
0
include, extend, prepend

include是把模块注入目标类或者模块中作为 prepend也是是把模块注入目标类或者模块中作为 他俩的区别是扩展module在祖先链的位置不同,include引入的module会在,prepend引入的module会在 exte...

小新是个程序媛
2018/05/24
0
0
ruby中的require load include extend

这四个方法还是很好玩很有用,也是比较容易混的。 1.require( aString ) -> true or false Ruby试图载入一个名为aString的库,如果成功了就返回true,否则返回false。如果给定的值不是一个绝...

孔俊
2013/08/06
264
0

没有更多内容

加载失败,请刷新页面

加载更多

带你了解 Java内存模型

Java内存模型的规定: 1、所有变量存储在主内存中; 2、每个线程都有自己的工作内存,且对变量的操作都是在工作内存中进行; 3、不同线程之间无法直接访问彼此工作内存中的变量,要想访问只能...

linux-tao
28分钟前
4
0
.net c# datetime转string 时间转字符串

.net c# datetime转string 时间转字符串 .net c# datetime转string 时间转字符串 刚开始接触net 时间转换字符串 一搜索出来的全是 字符串转时间,要么就是系统当前时间转字符串 就没有一个指...

青峰Jun19er
29分钟前
4
0
hbase demo

HbaseDao public class HbaseDao {@Testpublic void insertTest() throws Exception {Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.qu......

Garphy
39分钟前
3
0
IT兄弟连 HTML5教程 HTML5表单 多样的输入类型2

4 range range类型用于包含一定范围内数字值的输入域,跟number一样,我们还可以对数值设置限定,range类型显示为滑动条用法如下: 上述代码使用了range类型输入框,为该类型设置了数值范围为...

老码农的一亩三分地
39分钟前
3
0
对比不同的数据库连接的异同

博主在学习和使用数据库连接时,遇到的问题, 这个几个数据库连接究竟有什么不同? 到底什么时候该使用哪个会更好一点? 带着这个问题我们先去了解常见的数据库连接 1. 常见的数据库连接有哪些?...

理性思考
41分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部