初始化方法是Ruby中的内置方法吗?
为什么我们在创建新对象时必须传递参数,以及为什么它直接转到初始化方法?而且,我们可以创建一个没有初始化方法的类吗?
答案 0 :(得分:4)
您可以考虑Class#new
方法与每个类#initialize
方法之间的关系,或多或少地实现:
class Class
def new
instance = allocate()
instance.initialize
return instance
end
end
class Foo
def initialize
# Do nothing
end
end
您可以创建一个类而不显式定义#initialize
方法,因为#initialize
方法默认定义为什么都不做,并且它的返回值总是被忽略(无论您返回什么值)
您传递给Class#new
的参数始终以相同的顺序和格式直接传递给#initialize
。例如:
class Class
def new (arg1, arg2, &block_arg)
instance = allocate()
instance.initialize(arg1, arg2, &block_arg)
return instance
end
end
class MyClass
def initialize (arg1, arg2, &block_arg)
# Do something with args
end
end
答案 1 :(得分:3)
创建新对象背后的逻辑包括两个元素。首先,您需要在内存中创建一个新对象。这是通过在给定类上调用allocate
方法(它在Class类上定义)来完成的 - 它不需要参数,它的唯一责任是从ruby内存堆slab中获取一个空闲槽,在其中放置一个新对象找到并返回对象。第二步是在这个新创建的对象上调用initialize
方法 - 这就是initialize
是实例方法而不是类方法的原因。
默认的initialize
方法是该语言的一部分,它实际上什么都不做,并且没有任何参数。
new
方法只是一个方便的速记,首先调用allocate
方法,然后在{{返回的对象上调用initialize
方法(包含所有传递的参数) 1}}方法。