2012-03-14 2 views
2

Мне кажется странным создавать объект, вызывая «новое», но в определении класса инициализатор называется «инициализировать». Я попытался привести его в соответствие (будет называться «новый» в обоих определения класса и снаружи), поэтому я попытался код ниже, используя alias_method:Как я могу инициализировать метод в Ruby?

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

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

+0

Обратите внимание, что вы должны использовать 'alias_method: initialize,: new' (отметить запятую); однако, я думаю, это просто невозможно. – maerics

ответ

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 
+0

Так оно и есть! Он дает предупреждение о бесконечном цикле, и я изменил 'object' на' BasicObject', и он отлично работает! – texasbruce

+0

@texasbruce Это сломает любые скрипты, которые используют класс.new', чтобы создать новый класс, потому что, когда новый класс будет создан, он снова вызовет «новый», вернув * экземпляр * нового класса, а не сам класс – Gareth

+0

. У меня была эта проблема раньше, но то я понимаю, что новый метод является закрытым и недоступным снаружи, поэтому сначала будет вызываться система Class.new'. После создания объекта, когда мы снова вызываем new, Class.new не будет вызван, потому что Foo.new переопределяет это (все мое предположение) – texasbruce

6

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

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

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

+0

Можно ли «инициализировать» переопределить? – texasbruce

+1

, конечно, это основной способ настройки способа создания класса. – Gareth

1

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

alias_method :initialise, :new 

формат по умолчанию для alias_method выглядит следующим образом:

alias_method :new_function_name, :old_function_name. 

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

Смежные вопросы