`
Goldice
  • 浏览: 106959 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Ruby的Singleton method

阅读更多

Ruby中,特定于某一对象的方法被称为Singleton method。

 

例如:

 

a = "string"

def a.run
     puts "#{self} run"
end

str.run # =>#string run

 

 

run方法是特定于a这个对象的,故run方法是a的Singleton方法。

 

实现上,当定义Singleton方法时,Ruby会在对象a和String类之间插入一个匿名类,或者说Singleton类。此时,a的类为Singleton类,Singleton类的超类为String类。

 

我们考虑到String类其实也可以看为Class类的一个实例,所以Singleton方法也可以在类的层面上定义。

例如:

 

class A
      def self.run
            puts "#{self} run"
      end
end

A.run # => A run

 

只需要把A看做Class类的一个实例,而Singleton类插入到了A和Class类之间。

 

有人会发现,上面这段代码不是定义了一个类方法嘛?

yes, you got it !实际上,在Ruby中,没有所谓的“类方法”,所有的类方法都是通过Singleton类来实现的。

上面的代码也可以写为:

 

class A
         def A.run
               puts "#{self} run"
         end
end

 

 

同过这个Singleton类的存在,我们可以做很多有趣的操作:

 

str =  "string"

class << str
       def run
             puts "#{self} run"
       end
end

这种方式定义的结果与开头代码的结果是一致的。

我们可以利用这个Singleton类进行简单的元编程:

 

class A
end

a = A.new

class << a
        attr_accessor :attr
end

a.attr = 10
puts a.attr
在Singleton类中利用attr_accessor设定attr实例变量,这样我们相当于再程序运行时动态的改变了原有类,获得了更大的灵活性。

 

 

 

1
1
分享到:
评论

相关推荐

    ruby元编程.pdf

    4. 特殊方法(Eigenclasses):在Ruby中,每个类都有一个与其相关的单独类,被称为 eigenclass 或 singleton class,也常被称为 metaclass。通过理解 eigenclass 的工作原理,程序员可以实现更高级的元编程技巧,...

    元编程 Ruby

    Ruby中的每个类都拥有一个对应的元类(也称为eigenclass或singleton class),这是实现元编程的关键结构,因为元类允许我们在运行时给类动态地添加方法和属性。 Ruby的元编程能力在Rails框架中得到了广泛的应用。...

    ruby设计模式的代码有好多

    在Ruby中,可以使用`singleton_class`和`instance`方法来实现。例如: ```ruby class Singleton class def instance @instance ||= new end end end ``` 这个例子中,`@instance`变量保证了类的唯一实例...

    Ruby元编程基础学习笔记整理

    Ruby支持动态定义方法的能力,这可以通过`define_method`方法实现。 ##### 示例代码分析 ```ruby class MyClass define_method :my_method do |args| args * 3 end end obj = MyClass.new puts obj.my_method...

    Ruby中钩子方法的运用实例解析

    通过使用钩子方法,可以让我们在Ruby的类或模块的生命周期中进行干预,可以极大的提高编程的灵活性。 与生命周期相关的钩子方法有下面这些: 类与模块相关 Class#inherited ... BasicObject#singleton_method_r

    Programming Ruby

    `class 语法用于自定义类的实例方法,`define_method` 可以动态定义方法,而`Module#define_singleton_method`则能为单例对象定义方法。这些特性使Ruby成为构建框架和库的理想选择。 **标准库和Gem** Ruby的标准库...

    RUBY基础入门指南

    - **Singleton**:确保类只能有一个实例。 **8.4 Require, load和include** - `require`:加载并执行指定文件。 - `load`:加载文件,不会缓存。 - `include`:将模块混入到类中。 #### 九、异常 **9.1 异常处理...

    详解Ruby中的单件方法和单件类

    在Ruby编程语言中,单件方法(Singleton Method)和单件类(Singleton Class)是两个非常重要的概念。这些特性为Ruby提供了强大的灵活性,允许开发者针对特定的对象定义唯一的方法。下面将详细介绍这两者的工作原理...

    Ruby程序设计(简洁清新的教程)

    - `Singleton`:确保类只能有一个实例。 **8.4 Require, load和include** `require`和`load`用于加载其他Ruby文件,`include`用于将模块混入到类中。 #### 八、异常 **9.1 异常处理** Ruby使用`begin...rescue....

    ruby语法基础教程

    §8.3.3 Singleton 62 §8.4 Require, load和include 62 第九章 异常 64 §9.1 异常处理 64 §9.2 定义异常类 68 §9.3 catch和throw 68 第十章 多任务处理 69 §10.1 多线程处理 69 §10.1.1 线程创建 69 §10.1.2 ...

    Ruby程序设计.doc

    - **使用Method类和UnboundMethod类:** 获取和调用方法。 - **使用eval方法:** 执行字符串形式的Ruby代码。 **12.4 Hook和回调方法** - **Hook:** 特定事件发生时调用的方法。 - **回调方法:** 在特定时间点...

    gof patterns in ruby

    在Ruby中,单例模式可以通过使用`singleton`模块或者定义私有构造函数并提供静态方法来实现。 ### 结构型模式 #### Adapter(适配器) 适配器模式将一个类的接口转换成客户希望的另一个接口。这种模式使原本由于...

    Ruby程序设计高级教程

    - Singleton模块:确保一个类只有一个实例。 - **Require, load和include**:如何加载其他文件或模块。 #### 九、异常 - **异常处理**:try...rescue...else...ensure结构的使用。 - **定义异常类**:如何自定义...

    Ruby入门教程

    - **8.3.3 Singleton**:确保一个类只有一个实例。 **8.4 Require, load和include** - `require`:加载Ruby文件。 - `load`:加载Ruby文件,但不会检查是否已经加载过。 - `include`:用于引入模块。 #### 九、...

Global site tag (gtag.js) - Google Analytics