当前位置: 首页>编程语言>正文

ruby中include函数的用法 ruby include extend

 

在功能上require和load都是用来导入文件的.

区别如下:

1. require 用来加载库, 既然是用来加载库, 那么文件的扩展名就可以省略了, 同时又因为是加载的库, 所以会先检查是否重复加载, 如果未加载, 则再进行加载. 如果已加载, 则不加载.

2. load 用来加载文件. 既然是用来加载文件, 那么就要补全文件名+扩展名. 并且不会检查是否重复加载. 出现一次load就加载一次.

-----extend/include------

在功能上require和load都是用来导入模板(module)的. 存放在其他文件中的模板需要先通过require/load将文件导入过后, 才能使用相应的模板.

粗略记忆就是: include添加实例方法, extend添加类方法. 然而其实有些详细区别需要结合代码来理解. 详情如下:

这里需要补充一个新的知识, 就是ruby的模板 (关键字: module)

>> ----module-----

        module本身只是用来存放一些"方法的定义", 这些"方法的定义"代表的到底是类方法, 还是实例方法, 都是由调用者决定的.

至于调用者是怎么决定的, 就看下面的演示.

>> 演示1: 当 extend 和 include 作为"方法"时:

module Mod 
  def mod_func 
    puts "模板方法: #{self}" 
  end 
end 
class Klass 
  def class_func 
    puts "类方法: #{self}" 
  end end 
>> extend例子:
--------"类对象"调用extend(), 为自己添加新的"类方法"-------
a = Klass.extend(Mod)
a.mod_func # 模板方法: Klass
b = a.new 

b.class_func # 类方法: #<Klass:0x000000030f0ea8> 

b.mod_func # 报错: undefined method `mod_func' for #<Klass:0x00000003030a68>
--------"实例对象"调用extend(), 为自己添加新的"实例方法"-------
a = Klass.new
a.extend(Mod)
a.class_func # 类方法: #<Klass:0x000000030d17d8>
a.mod_func # 模板方法: #<Klass:0x000000030d17d8>Klass.mod_func # undefined method `mod_func' for Klass:Class (NoMethodError)

>> include例子
--------"类对象"调用include(), 为自己添加新的"实例方法"-------
a = Klass.include(Mod)
a.mod_func # undefined method `mod_func' for Klass:Class (NoMethodError)
b = a.new
b.class_func # 类方法: #<Klass:0x00000003040e90>b.mod_func # 模板方法: #<Klass:0x00000003040e90>
--------"实例对象"没有include()方法可用-------
a = Klass.new
a.include(Mod) # undefined method `include' for #<Klass:0x00000003100fd8> (NoMethodError)

>> 演示2: 当 extend 和 include 作为"关键字"时:

由上面演示已知, 有一个"类方法"叫extend(), 有一个"实例方法"也叫extend(); 有一个"类方法"叫include(), 没有一个"实例方法"叫include().

既然已知: 一个"类方法"叫extend(), 一个"类方法"叫include(), 那么我们就可以在自定义类的时候, 在类的"作用域"内使用类方法.

又因为: ruby有一个重要的概念叫"万物皆对象", 也就是说ruby内所有东西包括你的数字, 都是提前封装好的"对象", 都有"方法", 例如 "1.to_f", 把一个整形转换成浮点类型, 这里的"1"其实已经被ruby封装了.

所以: 当你在自定义一个"类"的时候, 在这个"类"的"作用域"中调用 extend() 和 include(), 到底是在调用"类方法"还是在使用"关键字"就说不清了, 而我英文又很差, 暂时看不了英文文档, 所以这个问题就只能搁置了. 从使用的"样式"来看, 姑且算是"使用关键字".

>> 模板Mod
module Mod 
  def mod_func  

    puts "模板方法: #{self}"  

  end  

end 
>> 自定义类, 并使用关键字 extend
class Klass
extend
  def class_func  

    puts "类方法: #{self}"  

  end  

end 
>> 自定义类, 并使用关键字 include
class Klass
include
  def class_func  

    puts "类方法: #{self}"  

  end  
end



https://www.xamrdz.com/lan/54k1963769.html

相关文章: