我们可能了解Ruby的singleton method概念,它指的是一个对象独有的方法。
下面举个简单的例子,首先来定义一个类:
class ExampleClass
def foo
puts 'foot'
end
end
然后创建两个实例,并且给第二个实例增加一个singleton method:
example1 = ExampleClass.new
example2 = ExampleClass.new
def example2.bar
puts 'bar'
end
example2.bar
它的输出结果是:
"bar"
而从下面这个结果我们可以看到,example1并不具有bar这个方法:
example1.bar #=> undefined method 'bar' for ... (No Method Error)
这就是所谓的singleton method。
我们还可以通过另外一种方式给example2定义一个singleton method:
class << example2
def bar
puts 'bar'
end
end
那Ruby是如何实现singleton method的呢?
当我们为一个特定的对象定义一个方法时,在对象和它的“真正类”之间会插入一个新的匿名类,而这个singleton method会定义在这个类中。所以,当我们调用bar方法时,解释器首先会在这个匿名类中寻找方法的定义,然后才会去“真正的类”ExampleClass那里去寻找。在Ruby里面,把这个匿名类称之为“singleton class
”或者“shadow class”。
让我们来看一下这个singleton class到底是什么:
puts example2.class
class << example2
puts self
end
输出结果:
ExampleClass
#<Class:#<ExampleClass:0x28305d>>
可以看到,bar方法定义所在的类的的确确并不是ExampleClass,而是一个匿名类。
类方法
在Ruby中,我们往往可以通过以下几种方式给一个类定义一个类方法:
class ClassMethodExample
def self.foo
puts 'class foo'
end
class << self
def bar
puts 'class bar'
end
end
end
class << ClassMethodExample
def baz
puts 'class baz'
end
end
def ClassMethodExample.tor
puts 'class tor'
end
ClassMethodExample.foo
ClassMethodExample.bar
ClassMethodExample.baz
ClassMethodExample.tor
输出结果为:
"class foo"
"class bar"
"class baz"
"class tor"
看了这种定义方式,是否发现它和给一个对象增加一个singleton method的方式很相似呢?
没错,其实他们就是一样的。在Ruby里面,一个类是一个实例,是类Class的一个实例
。那我们就很好理解这两种方式的一致性:给类增加一个类方法,不就是往“类”这个实例中增加一个singleton method么?
还是让我们来看看Ruby的对象模型
吧:
(图1:Ruby的对象模型)
上图中绿色代表”普通“类,蓝色代表meta-class。虚线代表类与对象间的关系(instance of),箭头指向的方向为”类的方向“。实线代表继承关系,箭头指向的方向为“父类”方向。
上例中的ExampleClass只是上图中所指的“普通类”Class的一个实例,可以通过下面的方法印证:
puts ExampleClass.new.class
puts ExampleClass.class
输出:
"ExampleClass"
"Class"
而相对于ExampleClass而言,类Class就是它的meta-class
。
所有的”最低级类“都是类Class的实例?没错。实际上,我们需要注意一点:类名是一个常量
。比如当我们调用ExampleClass.new时,我们实际上是向一个Class类的实例发送消息,而类名这个常量指向的就是这个实例。
再来看看,ClassMethodExample类中的类方法,实际上就是这个Class类实例的singleton method,它们也存在于这个实例的singleton class中:
puts ClassMethodExample.instance_methods.inspect
puts ClassMethodExample.class.instance_methods.inspect
class << ClassMethodExample
puts self.instance_methods.inspect
end
输出结果:
"['methods', 'freeze', ...]"
"['new', 'allocate', ...]"
"['bar', 'tor', ...]"
完毕。
Reference:
http://olabini.com/blog/tag/singleton-class/
http://www.hokstad.com/ruby-object-model.html
http://www.rubycentral.com/book/tut_classes.html
- 大小: 49.1 KB
分享到:
- 2009-08-08 21:11
- 浏览 1340
- 评论(1)
- 论坛回复 / 浏览 (-1 / 2018)
- 查看更多
相关推荐
### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...
Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...
Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...
Ruby是一种面向对象的动态编程语言,它以其简洁、优雅的语法和强大的元编程能力而闻名。在Web开发领域,Ruby与Rails框架的结合,即Ruby on Rails(RoR),开创了Web应用的新纪元。Ruby on Rails(简称Rails)是基于...
综上所述,Ruby on Rails的笔记内容涵盖了从安装Rails环境到创建和运行一个简单的Rails项目的基础知识,这些内容对于初学者来说是学习Rails框架的极好入门材料。通过对这些知识点的学习,初学者可以快速了解Rails的...
ruby rails demo, rails 简单demo。 (1)到ruby官网:http://www.ruby-lang.org/en/下载window安装包,并安装, ruby版本: ruby -v (2)安装Rails3 gem install rails (3)安装sqlite3 gem install sqlite3-ruby 安装...
Ruby on Rails,简称Rails,是一种基于Ruby编程语言的开源Web应用程序框架,以其“Convention over Configuration”(约定优于配置)和“Don't Repeat Yourself”(DRY,不要重复自己)的原则著称。Rails使得开发Web...
Ruby on Rails,简称Rails,是基于Ruby编程语言的一个开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和代码的可读性。Rails以其“约定优于配置”(Convention over Configuration)...
Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,极大地简化了Web应用的开发过程。Rails的哲学是“约定优于配置”,鼓励开发者遵循一套标准的...
例如,ActiveRecord是Rails中的一个关键组件,它提供了ORM(Object-Relational Mapping)功能,允许开发者用Ruby对象直接操作数据库,无需编写SQL语句。 在Rails中,路由(Routes)是连接URL与控制器动作的桥梁。...
Ruby on Rails 安装指南 Ruby on Rails 安装指南是指安装 Ruby 1.8.6 和 Rails 2.0.2 的详细步骤。首先,需要下载 Ruby One-Click Installer 版本,并安装 Ruby。然后,下载 Rails 2.0.2 版本,并安装。接下来,...
Ruby on Rails,简称Rails,是由David Heinemeier Hansson创建的一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性。在这个开发环境包中,我们拥有Ruby ...
在Ruby on Rails框架中,开发人员经常选择使用关系型数据库如SQLite、PostgreSQL或MySQL来存储数据。然而,随着NoSQL数据库的兴起,MongoDB因其灵活性和非结构化数据处理能力,也成为了许多Web应用程序的选择。本文...
"rails-search-form" 是一个基于 Ruby on Rails 框架的应用程序,它的主要功能是演示如何在 Rails 应用中创建和实现一个搜索表单。这个项目可能是一个教学示例或者代码库,帮助开发者了解如何在实际项目中集成用户...
Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用程序的开发。Rails由David Heinemeier Hansson于2004年创建,它提倡“约定优于配置...
《Ruby on Rails 101》是一本介绍Ruby on Rails(简称RoR或ROR)的基础书籍,旨在为初学者提供一个全面而深入的学习框架。本书由Peter Marklund编写,包含了五天课程的演示文稿和相关资料,覆盖了从安装到实际应用...
Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用程序框架,专为敏捷开发而设计,强调简洁的代码和“约定优于配置”的原则。它主要用于构建数据驱动的Web应用,借助于MVC(Model-View-Controller)...
Ruby 是一种高级、面向对象的编程语言,由日本开发者松本行弘(Yukihiro "Matz" Matsumoto)于1995年创建。Ruby 语言的设计哲学强调简洁和生产力,它结合了 Perl、Smalltalk、Eiffel、Ada 和 Lisp 等语言的特点,...
2. 数据库集成:Rails默认使用ActiveRecord,这是一个ORM(对象关系映射)库,允许开发者用Ruby代码操作数据库,无需编写SQL。在这个在线考试系统中,数据库可能包含试题、答案、考生信息、考试记录等表。 3. ...