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实例变量,这样我们相当于再程序运行时动态的改变了原有类,获得了更大的灵活性。
分享到:
相关推荐
根据给定文件的信息,这里似乎存在一定的混淆,因为文件内容主要涉及的是IBM Lotus Domino 7邮件服务器的配置指南,而非“Ruby元编程”。不过,基于您的需求,我将重点围绕“Ruby元编程”这一主题来生成相关的知识点...
4. 特殊方法(Eigenclasses):在Ruby中,每个类都有一个与其相关的单独类,被称为 eigenclass 或 singleton class,也常被称为 metaclass。通过理解 eigenclass 的工作原理,程序员可以实现更高级的元编程技巧,...
Ruby中的每个类都拥有一个对应的元类(也称为eigenclass或singleton class),这是实现元编程的关键结构,因为元类允许我们在运行时给类动态地添加方法和属性。 Ruby的元编程能力在Rails框架中得到了广泛的应用。...
在Ruby中,可以使用`singleton_class`和`instance`方法来实现。例如: ```ruby class Singleton class def instance @instance ||= new end end end ``` 这个例子中,`@instance`变量保证了类的唯一实例...
Ruby支持动态定义方法的能力,这可以通过`define_method`方法实现。 ##### 示例代码分析 ```ruby class MyClass define_method :my_method do |args| args * 3 end end obj = MyClass.new puts obj.my_method...
通过使用钩子方法,可以让我们在Ruby的类或模块的生命周期中进行干预,可以极大的提高编程的灵活性。 与生命周期相关的钩子方法有下面这些: 类与模块相关 Class#inherited ... BasicObject#singleton_method_r
`class 语法用于自定义类的实例方法,`define_method` 可以动态定义方法,而`Module#define_singleton_method`则能为单例对象定义方法。这些特性使Ruby成为构建框架和库的理想选择。 **标准库和Gem** Ruby的标准库...
- **Singleton**:确保类只能有一个实例。 **8.4 Require, load和include** - `require`:加载并执行指定文件。 - `load`:加载文件,不会缓存。 - `include`:将模块混入到类中。 #### 九、异常 **9.1 异常处理...
在Ruby编程语言中,单件方法(Singleton Method)和单件类(Singleton Class)是两个非常重要的概念。这些特性为Ruby提供了强大的灵活性,允许开发者针对特定的对象定义唯一的方法。下面将详细介绍这两者的工作原理...
- `Singleton`:确保类只能有一个实例。 **8.4 Require, load和include** `require`和`load`用于加载其他Ruby文件,`include`用于将模块混入到类中。 #### 八、异常 **9.1 异常处理** Ruby使用`begin...rescue....
§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 ...
- **使用Method类和UnboundMethod类:** 获取和调用方法。 - **使用eval方法:** 执行字符串形式的Ruby代码。 **12.4 Hook和回调方法** - **Hook:** 特定事件发生时调用的方法。 - **回调方法:** 在特定时间点...
在Ruby中,单例模式可以通过使用`singleton`模块或者定义私有构造函数并提供静态方法来实现。 ### 结构型模式 #### Adapter(适配器) 适配器模式将一个类的接口转换成客户希望的另一个接口。这种模式使原本由于...
- Singleton模块:确保一个类只有一个实例。 - **Require, load和include**:如何加载其他文件或模块。 #### 九、异常 - **异常处理**:try...rescue...else...ensure结构的使用。 - **定义异常类**:如何自定义...
- **8.3.3 Singleton**:确保一个类只有一个实例。 **8.4 Require, load和include** - `require`:加载Ruby文件。 - `load`:加载Ruby文件,但不会检查是否已经加载过。 - `include`:用于引入模块。 #### 九、...