Любой способ инициализировать объекты с «инициализировать» вместо «инициализировать»? - PullRequest
3 голосов
/ 07 марта 2019

Итак, поскольку я британец, я всегда инициализирую объекты с именем initialise() и довольно часто получаю ошибку Error in initialize: (wrong number of arguments (given n, expected 0)).

Могу ли я выполнить какое-нибудь метапрограммирование, чтобы сделать initialize() длявсе объекты пытаются вызвать initialise()?

Ответы [ 3 ]

4 голосов
/ 07 марта 2019

Нечто подобное может работать;но любой, кто читает или использует ваш код, может вас ненавидеть.: 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
2 голосов
/ 07 марта 2019

Пожалуйста, не делай этого.Когда-либо.Но давайте научим людей, как стрелять себе в ногу:

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).

0 голосов
/ 07 марта 2019

Драгоценный камень 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?

Код , стоящий за этой функцией, использует method_added для отслеживания добавления новых методов и выводит предупреждение, если Левенштейновское расстояние между именем метода и "initialize" равен ≤ 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...