ruby include require load extend 的区别

本文详细解析了Ruby中require与load的区别,以及extend和include的功能特性。通过具体示例展示了如何使用这些命令来导入库或文件,并解释了它们在模板(module)中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-----require/load------

在功能上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 Mod # 添加类方法

  def class_func 
    puts "类方法: #{self}" 
  end 

end 

>> 自定义类, 并使用关键字 include

class Klass

    include Mod # 添加实例方法

  def class_func 
    puts "类方法: #{self}" 
  end 

end 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值