我觉得通过调用“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
,而initialize
是new
的别名,因此会调用new
1}}。但它不起作用,并给出错误:
SyntaxError: test.rb:2: syntax error, unexpected ':'
alias_method :initialize :new
^
显然new
是一个关键词,不能别名。但是任何方式?
更新
抱歉,我错过了alias_method
添加逗号后,脚本运行时没有错误。但它不输出“bar”,因此不会调用新方法。我不确定为什么这不能作为下面的评论......
答案 0 :(得分:6)
请注意,initialize
和new
执行不同的操作。具体来说,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