在功能上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