打开类和猴子补丁
在Ruby中,类定义的方法和其他的语句没有任何区别,都是一行一行的执行下去的。如下例子:
class Example
def method_1
puts "method 1"
end
end
class Example
def method_2
puts "method 2"
end
end
本例中,当第一次定义Class Example的时候,还没有一个叫做Example的Class存在,因此,Ruby开始定义这个类,当后面在定义这个类时,Ruby会发现该类已存在,并返回这个类,而不是定义一个新类。
因为这个特性,因此,Ruby天生具有打开一个已经存在的类,并动态修改其内容的能力,即使其是标准类库的类也不例外。比方说,可以给SDK的String类添加一个去除String中的标点符号和特殊字符的方法:to_alphanumeric
class String
def to_alphanumeric
gsub /[^\w\s]/, ''
end
end
“H&&^^ello”.to_alphanumeric #==>Hello
,然后,所有的String对象都具备“to_alphanumeric”的能力了,这种技术一般简称为打开类技术。
上面描述的打开类技术其实是隐含了一定的风险的,尤其是在大型系统中使用打开类技术扩展标准类库时,因为,很多开发人员都在扩展类,当多个扩展方法的名字一样时, 后定义的总会覆盖掉前面,从而导致整个系统的崩溃,业界把这种鲁莽的修改类的方式简称为猴子补丁(Monkey Patch)。因此在使用打开类技术时,一定要慎之又慎。
类的真相
实例变量
在Ruby中,实例变量是存储在对象中,但是,其于该对象的类没有关系,当给对象的实例变量赋值时,该实例变量就生成了,说白了,实例变量就像是一个挂载在对象上的HashMap,每个对象都可以用自己不同的HashMap, 如下例:
class Person
def name
@name = "xianlinbox"
end
end
p = Person.new
puts p.instance_variables #==>nil
p.name
puts p.instance_variables #==>@name
方法
作为一个对象,除了有实例变量(也可以称之为属性),还需要有方法。 但是在Ruby中,关于方法的定义并不在对象中,而是在对象自身的类中,这是因为“共享同一个类的对象也必须共享同样的方法”。但是,不能说Class有一个叫做“method”的方法,因为无法使用"Class.method"调用该方法,而要说Class有一个实例方法“method”,这意味着必须创建该类的实例对象,通过实例对象调用该方法。
如果要定义类方法,那么在定义方法的时候,必须加类名前缀,如下:
class Person
def Person.name
@name = "xianlinbox"
end
end
类本身也是对象
在Ruby中Class本身也是一个对象,关于对象的所有规则都适用于Class.
puts "hello".class #=> String
puts String.class #=> Class
puts Class.class #=> Class
puts Class.instance_methods(false) #=> [:superclass,:allocate,:new]
puts Class.instance_variables #=> nil
类的继承体系
puts String.superclass #=> Object
puts Class.superclass #=> Module
puts Module.superclass #=> Object
puts Object.superclass #=> BasicObjec
puts BasicObject.superclass #=> nil
- BasicObject是继承体系的根节点。
- 所有类都继承自Object。
- Class是对Module的继承增强,增加了new()和allocate()方法以创建实例。
分享到:
相关推荐
《Ruby Programming:向Ruby之父学程序设计(第2版)》是为了让完全没有程序设计经验的读者也能灵活地使用Ruby,因此书中详细地说明了各种知识。从程序所需要的变量、常数、方法、类、控制结构等语法的说明,到类的主要...
在Ruby中,方法和类是构建程序的基本元素,它们是实现代码重用和组织的关键概念。 ### 方法(Methods) 方法在Ruby中是可重复使用的代码块,它们接受参数,执行特定任务,并可能返回值。方法定义使用`def`关键字...
《Ruby Programming—向Ruby之父学程序设计(第2版)》这本书旨在帮助初学者,甚至是完全没有编程背景的读者,快速掌握Ruby语言的基础和高级概念。 首先,Ruby是一种动态类型语言,这意味着变量的类型在运行时自动...
完整书名《Ruby Programming-向Ruby之父学程序设计》 ,就是那本经典的绿皮书 第一部分:通过简单的Ruby程序来介绍程序的基本架构。 第二部分:介绍基础语法规则,以及类、模块等面向对象程序设计的思考方法与...
[Ruby.Programming_向Ruby之父学程序设计(第2版)].(日)高桥征义,(日)后藤裕藏.扫描版(ED2000.COM).pdf ) 带书签
Ruby Ruby Ruby Ruby Ruby Ruby
《Ruby Programming_向Ruby之父学程序设计_第2版》PDF版本下载
ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...
本文将深入探讨Ruby语言中的类变量、全局变量、实例变量,以及多态的概念,并结合Ruby编码规范来阐述如何有效地编写代码。 一、类变量 类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的...
对于Unix或类Unix系统(如Linux和macOS),可以在终端执行以下命令: ```bash $ git clone https://github.com/rbenv/rbenv.git ~/.rbenv $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc $ echo '...
ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby
ruby的基础语言,如果使用ruby编程,测试框架的搭建
Ruby语言设计之初就非常注重开发人员的编程体验,它拥有自然、表达性强的语法,易于阅读和编写,因而备受广大开发者的喜爱。Ruby语言非常强调代码的可读性和简洁性,因此它在Web开发、尤其是Web框架Ruby on Rails中...
Ruby是一种强大的、面向对象的脚本语言,广泛用于Web开发、服务器端编程和各种应用程序。在Ruby的世界里,管理不同的Ruby实现(如MRI、JRuby、Rubinius、MagLev和MRuby)是非常重要的,这有助于开发者根据项目需求...
ruby源代码 ruby源代码 ruby源代码 ruby源代码2
《Ruby完全自学手册》是一本完全覆盖Ruby和Ruby on Rails的完全自学手册。《Ruby完全自学手册》的特色是由浅入深、循序渐进,注重理论和实践的结合。虽然定位为入门手册,但是依然涉及许多高级技术和应用,覆盖到的...
src-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2...
- **动态性**:Ruby支持运行时修改代码结构,允许开发者在程序运行过程中改变类和方法的行为。 - **元编程能力**:Ruby提供了一种称为元编程的技术,使得程序可以自我修改和自我扩展。 ### 二、Ruby编程基础 #### ...
然而,这种灵活性也意味着在某些情况下,程序可能会无意中修改核心的Ruby类或模块,这可能导致不可预测的行为,尤其是在生产环境中。为了防止这种情况,开发者可以使用特定的工具,如"Ruby-Refrigerator"。 "Ruby-...