浅谈ruby语言中的一些概念(class和module)

关于class和module

module的概念和使用场景

module适用于作为命名空间

用module来实现类的多重继承(mixin)

作为工具模块

作为工具模块,放通用方法,别的类里面直接include或者extend以后使用,也可以看成动态扩展业务类.module比较关注的是功能方面,它把方法收集在一起,组成一个特殊的上下文,通常表示一种能力.对module来说很难是逻辑完整的,因为module只能描述一个特殊的上下文,而这个上下文通常无法组成一个完整的对象,需要被找一个宿主,而这个宿主有可能是class,也有可能是module.也可以作为抽象类,module里面提供默认实现,业务类include或者extend以后覆盖.

class的概念和使用场景

类可以实例化

class就是我们所理解的经典的类,它是逻辑完整的,甚至能在现实世界中找到对应物,可以创建实例对象,包含实例变量和类变量,一般通过对象来与外界交流。

类的继承

类使用<作为继承的关键字,只支持单继承

module Space # 用作命名空间
  module A
    class B
    end
  end
  
  class C
  end
end

#######

module Cognize
  def read
    puts 'module read'
  end

  def write
    puts 'module write'
  end
end

class User
  include Cognize
  def read
    puts 'user read'
  end
end

u = User.new
u.read  # 'user read'  
u.write # 'module write' 继承了module里的write方法

########

require 'active_support'
module Member
  ## 此处的写法有多种,active_support提供了concern 的机制会自动
  ## include InstanceMethod 和 extend ClassMethod
  extend ActiveSupport::Concern

  ## 也可以 手动include InstanceMethod 和 extend ClassMethod
  include InstanceMethod
  extend ClassMethod

  module InstanceMethod
    def module_instance
      puts 'module instance'
    end
  end

  module ClassMethod
    def module_collection
      puts 'module collection'
    end
  end
end

class User
  include Member
end

User.module_collection # 'module collection'
u = User.new
u.module_instance # 'module instance'

总结

class和module的最大区别是,class可以实例化,module不可以.module更像是抽出的一块能力工具.
class可以继承,单继承于某个类,但是可以include多个module来'多重继承'.
在使用时除了命名空间外先使用class来写,后续如果有相似代码的提取的需要就引入module

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值