initialize方法是Ruby中的内置方法吗?

时间:2014-03-30 00:46:15

标签: ruby methods

初始化方法是Ruby中的内置方法吗?

为什么我们在创建新对象时必须传递参数,以及为什么它直接转到初始化方法?而且,我们可以创建一个没有初始化方法的类吗?

2 个答案:

答案 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}}方法。