如何在Ruby中初始化别名方法?

如何在Ruby中初始化别名方法?,ruby,Ruby,我觉得通过调用“new”来创建对象很奇怪,但在类定义中,初始化器被称为“initialize”。我试图使其一致(在类定义和外部都称为“new”),因此我使用alias_方法尝试了下面的代码: class Class alias_method :initialize :new end class Foo def new puts "bar" end end f = Foo.new 我想当我把new别名为initialize时,它会调用initializ

我觉得通过调用“new”来创建对象很奇怪,但在类定义中,初始化器被称为“initialize”。我试图使其一致(在类定义和外部都称为“new”),因此我使用alias_方法尝试了下面的代码:

class Class
    alias_method :initialize :new
end

class Foo
    def new
        puts "bar"
    end
end

f = Foo.new
我想当我把
new
别名为
initialize
时,它会调用
initialize
,而
initialize
new
的别名,所以它会调用
new
。但它不起作用,并给出错误:

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

    alias_method :initialize :new
                              ^
显然,
new
是一个关键字,不能使用别名。但是有办法吗


更新:

抱歉,我在
alias\u方法中漏掉了逗号


添加逗号后,脚本将正常运行。但它不会输出“bar”,所以不会调用新方法。我不确定为什么这不能作为下面的注释使用…

注意,
初始化
新建
做不同的事情。具体来说,
new
是类方法,
initialize
是实例方法

new
负责创建一个“新”对象、分配内存等,然后在创建对象后,通过要求其进行自我设置来初始化该对象


new
当然可以被覆盖,如中所示,但几乎可以肯定的是,除非您有很好的理由,否则您不想这样做。

我不知道覆盖
对象#初始化的含义是什么。如果我的代码中有这样的内容,我晚上就睡不好觉了,但是像这样的东西怎么样:

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

class Foo
  def new
    puts "BAR"
  end
end

Foo.new

错误不仅在于new是一个关键字,而且alias_方法的语法也是错误的。由于错误指定,您需要在两个函数名之间加“,”。在您的情况下,正确的语法是:

alias_method :initialise, :new
alias_方法的默认格式如下:

alias_method :new_function_name, :old_function_name.

您还应该注意,“alias_方法”在rails中不再被认为是良好的编程实践,您应该在相应的条件语句中使用“super”关键字。

注意您应该使用
alias_方法:initialize,:new
(注意逗号);然而,我认为这根本无法做到。是否可以覆盖“初始化”呢?当然,这是自定义类创建方式的主要方式,就是这样!它给出了无限循环的警告,我将
对象
更改为
基本对象
,它工作得非常完美@texasbruce这将中断任何使用
Class.new
创建新类的脚本,因为当创建新类时,它将再次调用
new
,返回新类的实例,而不是我以前担心的类本身,但后来我意识到新方法是私有的,不能在外部访问,因此将首先调用system
Class.new
。创建对象后,当我们再次调用new时,将不会调用Class.new,因为Foo.new覆盖了该类(我的全部假设)。一个支持事实是,如果我没有在
类Foo
中定义新方法,它将给出错误:
未定义新方法。
因此不会调用
类.new