`

ruby 元编程 2 打开类

    博客分类:
  • ruby
 
阅读更多

 

首先我们看下下面的代码

 

def to_alphanumerics(s)
  s.gsub /[\w\s]/, ""
end


require 'test/unit'

class To_Alphanumerics < Test::Unit::TestCase
  def test_to_alphanumerics
    assert_equal(to_alphanumerics('#3, the *M'),'#,*')
  end
end

 

 

实际上,to_alphanumerics个方法是不符合面向对象的思想的,我们应该让字符串自己去处理这个事情。这个时候我们就需要打开String类。

 

class Stirng
  def to_alphanumerics
    gsub /[\w\s]/, ""
  end
end


require 'test/unit'

class To_Alphanumerics < Test::Unit::TestCase
  def test_to_alphanumerics
    assert_equal('#3, the *M'.to_alphanumerics,'#,*')
  end
end

 

什么是类?

3.times do
  class C
    puts 'hello world'
  end
end

 Ruby执行了这些代码,并打印了3个hello world。现在我们感觉Ruby可能定义了3个重名的类,下面我们再看看另外的一段代码。

class D
  def x
    puts 'x'
  end
end

class D
  def y
    puts 'y'
  end
end

d = D.new
d.x
d.y

 从某种意义上说Ruby当中的class关键字更像是一个作用域操作符,而不是类型声明的语句。因为,当第一次提及class D的时候,还没有类D,因此Ruby创建了类D,当第二次提及class D的时候已经存在了类D,Ruby只需打开它,并添加方法y。在Ruby当中,class的核心作用是把你带到类的上下文当中,你可以在其中定义方法。

 

打开类所带来的问题

问题是新加的方法可能会覆盖类原来的同名方法。

 

def replace array,from,to
  array.each_with_index do |e,i|
    array[i]=to if e==from
  end
end

books = ['html5','java','css']

replace books,'java','ruby'

require 'test/unit'

class Test_replace < Test::Unit::TestCase
  def test_replace
    books = ['html5','java','css'];
    replace books,'java','ruby'
    assert_equal books,['html5','ruby','css']
  end
end

 测试完美通过,但是根据面向对象的原则,我们需要打开Array类,添加replace方法。

 

class Array
  def replace from,to
      each_with_index do |e,i|
      self[i]=to if e==from
    end
  end
end



require 'test/unit'

class Test_replace < Test::Unit::TestCase
  def test_replace
    books = ['html5','java','css']
    books.replace 'java','ruby'
    assert_equal books,['html5','ruby','css']
  end
end

 此时,如果程序中其他的地方用到了Array原有replace的地方,那么那个地方的测试会出错。这就是打开类的隐患,我们称之为猴子补丁。

分享到:
评论

相关推荐

    元编程 Ruby

    6. 元类(metaclass)或singleton class:Ruby中的每个类都拥有一个元类,元编程中会使用到这个元类来定义类方法或动态修改类。 7. 打开类(Open Class):在Ruby中,你可以随时打开一个已经定义的类,并给它添加新...

    Ruby面向对象编程中类的方法与类的扩展

    3. **使用单例类(元类)定义**: ```ruby class MyClass class def yet_another_class_method # 方法体 end end end ``` 这种方式直接揭示了类方法的本质——它们实际上是类自身的单例方法。 #### 类...

    The Ruby Programming Language 介绍

    《Ruby编程语言介绍》 Ruby,一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而备受程序员喜爱。它由日本人松本行弘(Yukihiro Matsumoto)在1990年代末设计并开发,旨在创建一种既...

    ruby ebook

    《Ruby编程语言》电子书资源,是为初学者准备的一份宝贵教材。这本书,由Addison-Wesley出版,第二版于2006年10月发行,书名是"The Ruby Way",作者未在提供的信息中提及,但可以肯定的是,它深入浅出地介绍了Ruby...

    Programming Ruby 2nd.pdf

    本书是《Programming Ruby, The Pragmatic Programmers' Guide》的第二版,为读者提供了一个深入了解Ruby编程语言的机会。 根据描述,“Programming Ruby”被赞誉为一本既聪明又有趣的书,它不仅教授了Ruby语言本身...

    Ruby详解及安装流程,Ruby是一种高级编程语言,具有简单易学、灵活多变、优雅美丽的语法特点.md

    3. **支持多种编程范式**:除了面向对象编程之外,Ruby还支持过程式和函数式编程,这给予了开发者更大的灵活性。 4. **强大的社区支持**:Ruby拥有一个活跃的开发者社区,这意味着有大量的资源、文档和工具可供学习...

    Metaprogramming ruby

    《Metaprogramming Ruby》是一本专注于Ruby编程语言元编程技术的书籍,由Paolo Perrotta撰写。元编程是一种编程范式,它允许在程序运行时修改或创建程序结构和行为。在Ruby中,元编程是其核心特性之一,使得代码能够...

    Ruby-一个Ruby的例子

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。在这个"Ruby-一个Ruby的例子"中,我们将探讨Ruby的基础知识,以及如何通过具体的代码示例来理解其核心特性。 首先,...

    Ruby工具 windows 环境

    Ruby支持面向对象编程,类、对象、继承、多态等特性一应俱全,同时也提供了函数式编程的一些特性,如高阶函数和块。 在Windows上编写Ruby脚本,可以使用任何文本编辑器,如Notepad++或Visual Studio Code,并保存...

    ruby-main.zip

    通过这个“Ruby学习指南”,你可以从基础到高级,全面掌握Ruby编程,包括类的设计、面向对象编程的精髓、元编程的技巧,以及如何利用Ruby的Gem生态进行高效开发。通过实践其中的示例和项目,你将能够深入理解并熟练...

    ruby1.8.6-26

    这个版本在当时是许多开发者和项目依赖的基础,它包含了对Ruby编程语言的基本特性以及对Windows操作系统的兼容性优化。本文将深入探讨Ruby 1.8.6在Windows平台上的安装过程、主要特点、使用场景以及与现代版本的差异...

    ruby实用函数和实例

    尽管没有具体说明文件内容,但通常在Ruby中处理文本文件,我们会用到File类,它提供了打开、读取、写入和关闭文件的方法。例如,`File.open('filename.txt', 'r')`可以用来读取文件,`File.write('filename.txt', '...

    ruby初始使用过程总结

    理解并熟练掌握这些步骤,你就能顺利开始你的Ruby编程之旅。记住,实践是学习的最佳途径,动手尝试才是王道。在实践中,你会遇到更多问题,解决它们,你的技能就会不断提升。祝你在Ruby的世界里探索愉快!

    ruby下载

    Ruby的核心特性包括元编程能力、动态类型、垃圾回收机制以及丰富的标准库。 在Windows环境下安装Ruby,通常需要两个主要的组件:Ruby安装程序和DevKit。从提供的文件名来看,我们有两个关键文件,分别是`...

    ruby metaprogramming examples

    在Ruby中,元编程的概念主要围绕着对象模型、方法定义、类的开放、以及块(blocks)等几个核心概念。以下是一些Ruby元编程的关键知识点: 1. 方法动态定义(Method Missing):Ruby允许通过定义一个`method_missing...

    ruby192安装包

    Ruby192的安装是开发者入门Ruby编程的第一步。有了这个安装包,用户可以利用Ruby的灵活性和强大功能进行Web开发(如使用Rails框架)、脚本自动化、系统管理任务等各种应用。不过,值得注意的是,Ruby1.9.2已经是一个...

    ruby1.8.5 和locale.properties

    Ruby 1.8.5 的主要特性包括元编程能力、面向对象编程的支持以及一种简洁而强大的语法。然而,随着 Ruby 社区的发展,更安全、性能更好的新版本如 Ruby 2.x 和 3.x 已经取代了它,因此现在使用 1.8.5 可能会遇到兼容...

    ruby2.5.1-2 x64 windows安装程序

    总结来说,"ruby2.5.1-2 x64 windows安装程序"是一个包含Ruby 2.5.1和DevKit的安装包,它为Windows用户提供了一站式的Ruby开发环境,使得在Windows上进行Ruby编程变得更为便捷。通过这个安装程序,开发者可以安装、...

    Python & Ruby 学习

    1. **元编程**:Ruby 的一大特点在于其强大的元编程能力,允许在运行时修改类和对象的行为。 2. **块、 Proc 和 Lambda**:Ruby 中的块是代码片段,Proc 和 Lambda 是可存储的代码对象,它们可以作为参数传递和返回...

Global site tag (gtag.js) - Google Analytics