`
clark1231
  • 浏览: 252749 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

浅谈Ruby on Rails中的include和extend

    博客分类:
  • ruby
阅读更多
       从模块引入方法、变量,使得编程变得简单,扩展性愈强,比以往的类的继承更灵活。这样的引入,仿佛将一个方法块,复制了一份放到了你所引用的类或者模块里面。你完全可以将多个互不相干的类中相同的方法拿出来写到一个模块中,这样可以使得代码精简,符合Ruby的设计初衷,而且,使得你的程序更有条理。

Ruby on Rails常见用法

通常引用模块有以下3种情况:
1.在类定义中引入模块,使模块中的方法成为类的实例方法
这种情况是最常见的
直接 include 即可
2.在类定义中引入模块,使模块中的方法成为类的类方法
这种情况也是比较常见的
直接 extend 即可
3.在类定义中引入模块,既希望引入实例方法,也希望引入类方法
这个时候需要使用 include,
但是在模块中对类方法的定义有不同,定义出现在self.included块中
def self.included(c) ... end 中

Ruby on Rails实例讲解

 

#基类  
module Base  
  #显示  
  def show  
    puts "You came here!"  
  end  
end  
class Car  
  extend Base   #扩展了类方法,我们可以通过Car.show调用  
end  
class Bus  
  include Base  #扩展了实例方法,可以通过Bus.new.show调用  
end 

 但是我们经常有这样的需要,希望基类足够强大,既可以扩展实例方法,也可以扩展类方法,Ruby on Rails同样提供了解决方案。

 

#基类  
module Base  
  def show  
    puts "You came here!"  
  end  
 
  #扩展类方法  
  def self.included(base)  
    def base.call  
      puts "I'm strong!"  
    end  
    base.extend(ClassMethods)  
  end  
 
  #类方法  
  module ClassMethods  
    def hello  
      puts "Hello baby!"  
    end  
  end
end  
 
class Bus  
  include Base  
end 

此时Bus已经具备了实例方法show,类方法:call 、hello,访问方式

Bus.new.show  
Bus.call  
Bus.hello 

  肯定也有人提出此类疑问,使用extend能够实现此功能不?

答案是:暂未找到,如您找到请明示,多谢!

我也曾经做过以下实验,结果没有成功,在此也张贴出来,希望能给您带来一些启示。

 

#基类  
module Base  
  def show  
    puts "You came here!"  
  end  
    
    #扩展实例方法  
  def self.extended(base)  
    base.extend(InstanceMethods)  
  end  
 
  module InstanceMethods  
    def love  
      puts 'We are instances,loving each other!'  
    end  
  end
end  
 
class Car  
  extend Base  
end 

但是这样,实例方法扩展失败,依然扩展了类方法

 

Car.show  
Car.love             #类方法  
Car.new.love      #undefined method 'love'  
分享到:
评论

相关推荐

    Ruby on Rails中的include和extend的常见用法

    在Ruby on Rails中,`include`和`extend`是用来引入模块到类或对象中的关键语法,它们可以帮助我们更好地组织和重用代码。这两个关键字的主要区别在于它们如何将模块中的方法添加到目标类或对象。 首先,`include`...

    模块的力量:Ruby中include与extend的深度解析

    ### 模块的力量:Ruby中include与extend的深度解析...总之,通过理解和掌握`include`和`extend`这两个关键字,开发者可以在Ruby中更好地利用模块的力量来实现代码的复用和扩展,从而构建出更加高效和可维护的应用程序。

    Ruby中文参考手册

    10. **模块混合**:Ruby的模块可以被类“混入”(include或extend),实现跨类的代码共享。 11. **类和对象初始化**:Ruby中通过initialize方法初始化对象,而Class.new可以用来创建新的类。 12. **Ruby on Rails*...

    Ruby语言入门教程(附源码文件)

    它强调简洁性、可读性和开发者的生产力,是许多开发者首选的语言,尤其在Web开发领域,如Ruby on Rails框架的应用。本教程将引导你了解Ruby语言的基本概念和语法,帮助你快速入门。 1. **变量和数据类型** Ruby...

    Agile Web Development with Rails Final

    Ruby on Rails (often shortened as Rails) is a server-side web application framework written in Ruby under the MIT License. It uses Model-View-Controller (MVC) architecture and emphasizes convention ...

    ruby经典

    6. **Ruby on Rails**:Ruby的经典应用是Ruby on Rails框架,它是一种基于模型-视图-控制器(MVC)架构模式的Web开发框架,以其“约定优于配置”和“Don't Repeat Yourself”(DRY)原则著称,极大地提高了开发效率...

    有关Ruby入门文章

    Ruby on Rails(简称Rails)是Ruby的一个热门Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。Rails的特色包括ActiveRecord(ORM,对象关系映射)、DHH的约定优于配置(Convention over Configuration,CoC)...

    Ruby中文教程。。。

    模块可以通过`include`或`extend`引入到其他类或对象中。 三、元编程 1. 动态性:Ruby允许在运行时修改类和对象,如动态添加方法`define_method`,或在运行时改变对象的属性。 2. 方法_missing:此方法允许自定义...

    ruby-main.zip

    8. **模块化编程**:Ruby的模块系统支持命名空间和混合(mixin),通过`include`或`extend`关键字,模块可以被纳入类中,实现代码的复用和组织。 9. **闭包**:Ruby中的Blocks、Procs和Lambdas都具有闭包特性,能...

    Ruby语言中文教程

    - Ruby最著名的框架是Ruby on Rails,它提供了快速开发Web应用的工具。了解MVC架构,路由,ActiveRecord(ORM)以及Rails的其他核心组件。 8. **代码测试** - 在Ruby中,进行单元测试和集成测试是非常重要的实践...

    ruby初学笔记ruby初学笔记

    11. **Rails框架(Ruby on Rails)**:Ruby的流行很大程度上归功于Ruby on Rails,这是一个强大的Web应用框架,遵循“约定优于配置”和“DRY(Don't Repeat Yourself)”的原则,极大地提升了开发效率。 12. **测试...

    ruby笔记2ruby笔记2ruby笔记2

    Ruby支持单继承,但可以通过模块混入(`include`和`extend`)实现多重功能继承。 5. **常量与符号**:常量在Ruby中以大写字母开头,全局可见;符号是不可变的引用,常用于哈希键和方法调用。 6. **数组与哈希**:...

    Ruby-Way.rar_About Language

    此外,书中可能涵盖了Ruby on Rails框架,它是基于Ruby构建Web应用的最受欢迎的框架之一,强调DRY(Don't Repeat Yourself)原则,推崇 Convention Over Configuration(约定优于配置)的理念。 在文件列表中,我们...

    元编程 Ruby

    3. 模块混入:Ruby中的模块可以被包含(include)到类中,这在本质上是把模块中的方法和类混合,从而增强类的功能。这里涉及到的还有模块的内联扩展。 4. 代码块(Blocks)、迭代器(Iterators)和Procs:它们是...

    ruby_quiz.rar

    6. **模块和 Mixins**:Ruby的模块可以用来组织代码,也可以通过`include`或`extend`来实现代码重用和混合行为。 7. **异常处理**:理解如何使用`begin/rescue/ensure`来捕获和处理程序运行时的错误,是编写健壮...

    ruby使用文档

    - 模块用于代码组织和命名空间隔离,可以使用`include`、`extend`引入模块功能。 5. **继承与多态**: - Ruby支持单继承,但通过模块混入可以实现多重继承的效果。 - 多态性通过方法重写和消息转发实现。 6. **...

Global site tag (gtag.js) - Google Analytics