我怎样才能在Ruby中使用initialize方法?

时间:2012-03-14 20:17:29

标签: ruby

我觉得通过调用“new”创建一个对象很奇怪,但在类定义中,初始化程序称为“initialize”。我试图让它保持一致(在类定义和外部都称为“new”)所以我尝试使用alias_method下面的代码:

class Class
    alias_method :initialize :new
end

class Foo
    def new
        puts "bar"
    end
end

f = Foo.new

我想当我将new设为initialize时,它会调用initialize,而initializenew的别名,因此会调用new 1}}。但它不起作用,并给出错误:

SyntaxError: test.rb:2: syntax error, unexpected ':'

    alias_method :initialize :new
                              ^

显然new是一个关键词,不能别名。但是任何方式?


更新

抱歉,我错过了alias_method

中的逗号

添加逗号后,脚本运行时没有错误。但它不输出“bar”,因此不会调用新方法。我不确定为什么这不能作为下面的评论......

3 个答案:

答案 0 :(得分:6)

请注意,initializenew执行不同的操作。具体来说,new是一种类方法,initialize是一种实例方法。

new负责创建一个“新”对象,分配内存等,然后一旦创建了对象,就会initialize d,要求它自行设置。

new当然可以被覆盖,如this blog example所示,但除非你有充分的理由,否则几乎可以肯定你不想这样做。

答案 1 :(得分:1)

错误不只是关于new是关键字,而且alias_method的语法也是错误的。由于错误指定您需要放置","两个函数名之间。在您的情况下,正确的语法是:

alias_method :initialise, :new

alias_method的默认格式如下:

alias_method :new_function_name, :old_function_name.

另外你应该注意" alias_method"在rails中不再被认为是良好的编程习惯,你应该使用" super"带有相应条件语句的关键字。

答案 2 :(得分:0)

我不知道覆盖Object#initialize的含义是什么。在我的代码中,我不会在晚上睡得很好但是如下:

class Object
  def initialize
    new if self.respond_to?(:new)
  end
end

class Foo
  def new
    puts "BAR"
  end
end

Foo.new