`
jack_boy
  • 浏览: 138366 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ruby mix-in

阅读更多
Ruby mix-in
Ruby 是一门面向对象的语言,所有一切都是对象包括基本数据类型变量(如:int,double,string,hash)等,函数,类型本身也是对象。Ruby在语言设计时没有采用C++等语言的多重继承,而是采用Java单继承的方式。也就是说每个类只能有一个父类,但是根据DRY的知道原则,多重继承在面向对象中是非常必要的。Java采用接口方式实现多重继承,Ruby则用mix-in方式实现。Java的interface不能定义具体的实现,mix-in方式是可以达到实现服用的效果的。
先看一下mix-in的具体实例
class Person
  attr_accessor :name, :age, :gender
  def initialize(name)
    @name = name
  end
end

module UsefulFeatures
  def come_in(person)
    self.current_person = person
    #set_current_person(person)
  end
  def current_person
    #self.current_person
    @current_person
  end

  def set_current_person(person)
    puts "set current person"
    @current_person = person
  end

end

class Room
  include UsefulFeatures

  def current_person=(person)
    #self.current_person = person
    puts "set current person (use = )"
    @current_person = person
  end
end


if __FILE__ == $0
  jack = Person.new("jack")
  puts "name: #{jack.name}"
  bob = Person.new("bob")

  room = Room.new()
  room.come_in(jack)
  puts "room current person #{room.current_person.name}"
end


运行结果:
> ruby test_mixin.rb
name: jack
set current person (use = )
room current person jack


可以看到例子中使用module定义一个类,在ruby中由module定义的类用
include module name
方式在其它类中使用。由module定义的类没有父类,也不能被实例话,因此就避免了复杂的继承树。

注:module中调用self.current_person = "..."实际上是调用Room的current=(person)方法。
如果将UsefulFeatures中的current_person改为
def current_person
    self.current_person
    #@current_person
end

运行脚本会得到如下错误
mix_in.rb:14: stack level too deep (SystemStackError)
因为在Ruby中所有一切都是对象,在ruby中不能直接访问类中的(实例)变量,所以self.current_person实际上调用的是current_person方法。因此current_person被调用无限次,所以报错。这就是一切皆是对象,当然只是其中一点,还有更多的有待与学习。

将UsefulFeatures中的come_in改为
def come_in(person)
    #self.current_person = person
    set_current_person(person)
end
再次运行程序得到
name: jack
set current person
room current person jack

直接使用UsefulFeatures中的set_current_person方法。mix-in实现的多重继承即避免的复杂的继承树,又达到了方法实现服用的目的。
0
0
分享到:
评论

相关推荐

    yangbinfx的博客文章-ruby部分备份

    8. **ruby mix-in**:进一步探讨了如何有效地利用模块(mix-in)来设计和组织代码,以及它们在类继承结构中的作用和影响。 9. **flash对象**:在Rails中,Flash是一个用于短暂存储消息的对象,它可以在一次请求之间...

    Ruby_向ruby之父学程序设计(第二版)(经典入门)

    第四部分:介绍一些比较高级的功能,比如Ruby的环境参数、环境变量、迭代器的用法与做法、Mix-in等。  第五部分:介绍比较复杂一点的程序范例,试着使用Ruby来写出比较实用的程序。  附录:使用Ruby时所需的知识...

    Ruby-Behaves是一个gem可以帮助您定义类之间的行为

    Behaves gem的核心概念是行为模式(Behavior Pattern),它允许我们将一组相关的方法打包成一个模块,然后将其混入(mix-in)到需要这个行为的类中。这种设计模式有助于减少代码重复,提高代码复用,并使代码结构...

    ruby-2.5.1

    另外,Ruby的模块(Module)提供了命名空间管理和混合(Mix-in)功能,使得代码组织更加灵活。 Ruby的元编程能力是其独特之处,它允许在运行时动态修改代码,创建高度自定义的行为。`eval`函数可以执行字符串作为...

    Sams - Teach Yourself Ruby in 21 Days.pdf

    - **模块与混合**:介绍如何使用模块和混合(mix-in)来组织代码,实现代码重用。 - **异常处理**:讲解异常处理机制,包括如何定义自定义异常以及如何优雅地处理错误。 - **并发编程**:介绍Ruby中的线程模型及其在...

    Ruby-:Ruby的基础

    模块还可以用来实现命名空间和混入(Mix-in)功能,通过`include`关键字将模块的方法引入到类中。 7. **异常处理**:Ruby提供了异常处理机制,使用`begin/rescue/else/ensure`块来捕获和处理运行时错误。 8. **...

    RUBY 教程.doc

    1. **模块与混合(Mix-in):** 模块可以用来组织代码或者提供特定功能,通过`include`关键字可以让一个类包含模块中的方法。 2. **元编程:** RUBY强大的元编程能力允许在运行时动态修改程序的行为。 3. **异常处理...

    From Java to Ruby

    另外,Ruby中的模块(Module)和Java的包(Package)相似,但模块还扮演着命名空间和混入(Mix-in)的角色。混入允许模块中的方法被其他类直接继承和使用,这是一种不同于Java继承的独特方式。 在错误处理方面,...

    ruby-design-patterns:Russ Olsen 的 Ruby 设计模式

    Ruby中可以通过组合或模块混入(mix-in)来实现装饰器。 5. **策略模式**:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。在Ruby中,可以使用模块和 Duck Typing(动态类型)来实现策略。 ...

    Ruby元编程pdf

    模块用于代码复用和命名空间管理,但也可作为混入(mix-in)来添加方法到类。 2. **方法**:Ruby的方法定义可以嵌套,并且可以动态添加或删除。`method_missing`是Ruby的一个特殊方法,当调用一个未定义的方法时,...

    ruby入门书籍

    5. **模块(Module)**:模块是组织代码的方式,可以实现命名空间、混入(Mix-in)功能,使得代码可复用性增强。 6. **元编程**:Ruby的强大之处在于其元编程能力,允许在运行时修改和创建代码,极大地提高了灵活性...

    ruby程序设计

    此外,Ruby还支持模块(Module),它们可以包含方法和常量,且可以被多个类混合(Mix-in)以扩展功能。 总之,"ruby程序设计"涵盖了从Ruby语言基础到高级特性的全面讲解,包括Ruby的历史、特性,环境配置,类与对象...

    Programming Ruby (English Version) and Source Code

    4. **模块(Module)**:Ruby的模块用于实现命名空间、混合(Mix-in)功能,以及提供类的方法集。 5. **方法和块的参数**:包括默认参数值、可变数量的参数、块参数等。 6. **异常处理**:Ruby中的`begin-rescue-...

    ruby基础教程(第四版)第8章 模块 1

    当有多个类需要共享相同的功能,而我们又不想让它们成为同一个类的子类时,就可以使用模块Mix-in。需要注意的是,模块函数在被包含进类后,会变成类的私有实例方法,无法直接在类的外部调用。 在Ruby中,类的方法...

    Hello, Ruby World!

    - **模块与混合**:Ruby支持模块,模块可以包含方法和常量,并可以通过混合(mix-in)方式添加到类中。 ##### 3. 方法约定 - **命名规则**:方法名通常遵循一定的命名约定,如以问号(`?`)结尾的方法通常返回布尔...

    Prorammer ruby 语法截图

    - `module`定义模块,用于封装代码和实现模块混合(mix-in)。 10. **继承与多态** - 使用`进行类的继承,如`class ChildClass ; ...; end`。 - 多态主要通过方法覆盖(method overriding)和鸭子类型(duck ...

    ruby中文教程,pdf格式,含.rb源代码

    2. **对象和类**:Ruby是面向对象的语言,会讲解类的定义、对象的创建、继承、模块(Module)的作用以及混合(Mix-in)机制。 3. **方法**:学习如何定义和调用方法,包括块(Block)、Proc和Lambda的区别,以及...

    Ruby for Rails

    - 模块可以包含多个方法定义,并且可以通过混合使用(mix-in)的方式添加到其他类中,实现代码复用。 - 类和模块可以组合使用,来构建复杂的程序结构。 3. **默认对象(self)与作用域** - `self`关键字在Ruby中...

Global site tag (gtag.js) - Google Analytics