Jon*_*ard 6 ruby design-patterns
在Ruby中,在创建一个新类时,我们将定义构造函数方法,如下所示:
class Thing
def initialize
do_stuff
end
end
Run Code Online (Sandbox Code Playgroud)
但是,当实际创建对象的实例时,我们发现自己没有调用initialize实例而是调用new类.
既然如此,我们为什么不改为定义::new呢?
class Thing
def self.new
do_stuff
end
end
Run Code Online (Sandbox Code Playgroud)
是不是有什么::new不beind的场面initalize并没有定义?这两者有什么不同吗?定义::new工作?或者只是def initialize更短(不是)def self.new?
我认为必须有一个很好的理由来弥补这种差异.
Abr*_*m P 12
New为新对象分配空间并创建它.然后,它调用Objects initialize方法,使用分配的内存创建一个新的Object.通常,您要自定义的唯一部分是实际创建,并且很乐意将后台内存分配留给Object.new方法,因此您编写了一个初始化方法.引擎盖下的新功能看起来像这样(C中除外):
class Object
def self.new(*args, &block)
object = allocate
object.send(:initialize, *args, &block)
return object
end
end
Run Code Online (Sandbox Code Playgroud)
所以当你调用Object.new时,实际发生的是:
1)分配内存2)调用对象初始化方法.
提供对实例变量的访问.
实例变量(@value例如)只能从实例访问,而不能从类方法中访问.这与Java之类的语言不同,其中私有实例变量具有类而不是实例范围,因此可以从静态构造函数访问.
class Thing
def initialize
@value = 42
end
end
class Thing
def self.new
# no way to set the value of @value !!!!!!!!
end
end
Run Code Online (Sandbox Code Playgroud)
对于那些对Ruby历史感兴趣的人来说,具有实例私有实例变量的对象模型可以追溯到Smalltalk.你可以在现代的Smalltalk方言中找到相同的模式,如Pharo,new实现Object调用self initialize,以便子类可以轻松初始化实例变量.
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |