所以,因为我是英国人,所以我总是用名称initialise()
初始化对象,并且经常会收到错误Error in initialize: (wrong number of arguments (given n, expected 0))
。
我是否可以做一些元编程来使所有对象尝试调用initialize()
的{{1}}?
答案 0 :(得分:4)
类似的事情可能起作用;但是任何阅读或使用您的代码的人都可能讨厌您。 :P
class BasicObject
alias american_initialize initialize
private def initialize(*args, &block)
if respond_to?(:initialise)
initialise(*args, &block)
else
american_initialize(*args, &block)
end
end
end
答案 1 :(得分:2)
请不要这样做。曾经但是,让我们教人们如何用脚射击:
class BasicObject
def self.new(*args)
if instance_methods.member? :initialise
allocate.initialise(*args)
else
super
end
end
end
所以这里发生了什么:我们只是改写了.new
定义。默认情况下,它先呼叫#allocate
,然后再#initialize
传递您发送给它的*args
。
.allocate
为对象分配内存,但不对其调用#initialize
,因此我们检查对象是否定义了#initialise
实例方法,是否调用了该对象,否则,将使用默认行为(super
)。
答案 2 :(得分:0)
did_you_mean
宝石(Ruby 2.3和更高版本附带)可以帮助您避免此类错误:
require 'did_you_mean/experimental'
class Foo
def initialise
end
end
输出:
warning: initialise might be misspelled, perhaps you meant initialize?
此功能背后的code使用method_added
来监视新方法的添加,并在方法名称与“初始化” Levenshtein distance时显示警告。 >≤2。