有什么办法用“初始化”而不是“初始化”来初始化对象?

时间:2019-03-07 09:26:16

标签: ruby

所以,因为我是英国人,所以我总是用名称initialise()初始化对象,并且经常会收到错误Error in initialize: (wrong number of arguments (given n, expected 0))

我是否可以做一些元编程来使所有对象尝试调用initialize()的{​​{1}}?

3 个答案:

答案 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。