首先我们看下下面的代码
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的地方,那么那个地方的测试会出错。这就是打开类的隐患,我们称之为猴子补丁。
相关推荐
6. 元类(metaclass)或singleton class:Ruby中的每个类都拥有一个元类,元编程中会使用到这个元类来定义类方法或动态修改类。 7. 打开类(Open Class):在Ruby中,你可以随时打开一个已经定义的类,并给它添加新...
3. **使用单例类(元类)定义**: ```ruby class MyClass class def yet_another_class_method # 方法体 end end end ``` 这种方式直接揭示了类方法的本质——它们实际上是类自身的单例方法。 #### 类...
《Ruby编程语言介绍》 Ruby,一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而备受程序员喜爱。它由日本人松本行弘(Yukihiro Matsumoto)在1990年代末设计并开发,旨在创建一种既...
《Ruby编程语言》电子书资源,是为初学者准备的一份宝贵教材。这本书,由Addison-Wesley出版,第二版于2006年10月发行,书名是"The Ruby Way",作者未在提供的信息中提及,但可以肯定的是,它深入浅出地介绍了Ruby...
本书是《Programming Ruby, The Pragmatic Programmers' Guide》的第二版,为读者提供了一个深入了解Ruby编程语言的机会。 根据描述,“Programming Ruby”被赞誉为一本既聪明又有趣的书,它不仅教授了Ruby语言本身...
3. **支持多种编程范式**:除了面向对象编程之外,Ruby还支持过程式和函数式编程,这给予了开发者更大的灵活性。 4. **强大的社区支持**:Ruby拥有一个活跃的开发者社区,这意味着有大量的资源、文档和工具可供学习...
《Metaprogramming Ruby》是一本专注于Ruby编程语言元编程技术的书籍,由Paolo Perrotta撰写。元编程是一种编程范式,它允许在程序运行时修改或创建程序结构和行为。在Ruby中,元编程是其核心特性之一,使得代码能够...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。在这个"Ruby-一个Ruby的例子"中,我们将探讨Ruby的基础知识,以及如何通过具体的代码示例来理解其核心特性。 首先,...
Ruby支持面向对象编程,类、对象、继承、多态等特性一应俱全,同时也提供了函数式编程的一些特性,如高阶函数和块。 在Windows上编写Ruby脚本,可以使用任何文本编辑器,如Notepad++或Visual Studio Code,并保存...
通过这个“Ruby学习指南”,你可以从基础到高级,全面掌握Ruby编程,包括类的设计、面向对象编程的精髓、元编程的技巧,以及如何利用Ruby的Gem生态进行高效开发。通过实践其中的示例和项目,你将能够深入理解并熟练...
这个版本在当时是许多开发者和项目依赖的基础,它包含了对Ruby编程语言的基本特性以及对Windows操作系统的兼容性优化。本文将深入探讨Ruby 1.8.6在Windows平台上的安装过程、主要特点、使用场景以及与现代版本的差异...
尽管没有具体说明文件内容,但通常在Ruby中处理文本文件,我们会用到File类,它提供了打开、读取、写入和关闭文件的方法。例如,`File.open('filename.txt', 'r')`可以用来读取文件,`File.write('filename.txt', '...
理解并熟练掌握这些步骤,你就能顺利开始你的Ruby编程之旅。记住,实践是学习的最佳途径,动手尝试才是王道。在实践中,你会遇到更多问题,解决它们,你的技能就会不断提升。祝你在Ruby的世界里探索愉快!
Ruby的核心特性包括元编程能力、动态类型、垃圾回收机制以及丰富的标准库。 在Windows环境下安装Ruby,通常需要两个主要的组件:Ruby安装程序和DevKit。从提供的文件名来看,我们有两个关键文件,分别是`...
在Ruby中,元编程的概念主要围绕着对象模型、方法定义、类的开放、以及块(blocks)等几个核心概念。以下是一些Ruby元编程的关键知识点: 1. 方法动态定义(Method Missing):Ruby允许通过定义一个`method_missing...
Ruby192的安装是开发者入门Ruby编程的第一步。有了这个安装包,用户可以利用Ruby的灵活性和强大功能进行Web开发(如使用Rails框架)、脚本自动化、系统管理任务等各种应用。不过,值得注意的是,Ruby1.9.2已经是一个...
Ruby 1.8.5 的主要特性包括元编程能力、面向对象编程的支持以及一种简洁而强大的语法。然而,随着 Ruby 社区的发展,更安全、性能更好的新版本如 Ruby 2.x 和 3.x 已经取代了它,因此现在使用 1.8.5 可能会遇到兼容...
总结来说,"ruby2.5.1-2 x64 windows安装程序"是一个包含Ruby 2.5.1和DevKit的安装包,它为Windows用户提供了一站式的Ruby开发环境,使得在Windows上进行Ruby编程变得更为便捷。通过这个安装程序,开发者可以安装、...
1. **元编程**:Ruby 的一大特点在于其强大的元编程能力,允许在运行时修改类和对象的行为。 2. **块、 Proc 和 Lambda**:Ruby 中的块是代码片段,Proc 和 Lambda 是可存储的代码对象,它们可以作为参数传递和返回...