Как я могу псевдоним инициализировать метод в Ruby? - PullRequest
2 голосов
/ 15 марта 2012

Мне кажется странным создавать объект, вызывая «new», но в определении класса инициализатор называется «initialize».Я попытался сделать его непротиворечивым (чтобы его называли «новым» как в определении класса, так и за его пределами), поэтому я попробовал приведенный ниже код, используя 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.Но это не работает, и выдает ошибки:

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

    alias_method :initialize :new
                              ^

Видимо new является ключевым словом и не может быть псевдонимом.Но как обходится?


Обновление:

Извините, я пропустил запятую в alias_method

После добавления запятой сценарий запускается без ошибок.Но он не выводит «bar», поэтому новый метод не вызывается.Я не уверен, почему это не будет работать, как комментарии ниже ...

Ответы [ 3 ]

6 голосов
/ 15 марта 2012

Обратите внимание, что initialize и new делают разные вещи.В частности, new является методом класса, а initialize является методом экземпляра.

new отвечает за создание «нового» объекта, выделение памяти и т. Д., А затем, как только объект создан, он становитсязатем initialize d, попросив его настроить себя.

new, безусловно, можно переопределить, как показано в этом примере блога , но почти наверняка вы не захотитеделайте это, если у вас нет веских причин.

1 голос
/ 08 марта 2013

Ошибка не только в том, что новое является ключевым словом, но и ваш синтаксис для alias_method также неверен. Поскольку ошибка указывает, вам нужно поставить «,» между двумя именами функций. В вашем случае правильный синтаксис будет:

alias_method :initialise, :new

Формат по умолчанию для alias_method следующий:

alias_method :new_function_name, :old_function_name.

Также вы должны отметить, что «alias_method» больше не считается хорошей практикой программирования в rails, и вам следует использовать ключевое слово «super» с соответствующими условными выражениями.

0 голосов
/ 15 марта 2012

Я понятия не имею, что означает переопределение Object#initialize.Я бы не спал по ночам с этим в моем коде, но как насчет чего-то вроде:

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

class Foo
  def new
    puts "BAR"
  end
end

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