Ruby - метод перезаписи def - PullRequest
3 голосов
/ 10 августа 2010

Как мне перезаписать метод def ? Но это странно, потому что я не знаю, откуда определяется метод def. Это не Module, не Object, не BasicObject (из Ruby 1.9). И def.class ничего не говорит;)

Я хотел бы использовать что-то вроде:

sub_def hello
  puts "Hello!"
  super
end

def hello
  puts "cruel world."
end

# ...and maybe it could print:
# => "Hello!"
# => "cruel world."

Большое спасибо, за любые идеи.

Ответы [ 4 ]

6 голосов
/ 10 августа 2010

Кто вам сказал def это метод? Это не. Это ключевое слово, например class, if, end и т. Д. Поэтому вы не можете перезаписать его, если не хотите написать собственный интерпретатор ruby.

1 голос
/ 12 августа 2010

Вы можете использовать блоки, чтобы делать подобные вещи:

def hello
  puts "Hello"
  yield if block_given?
end

hello do
 puts "cruel world"
end
1 голос
/ 10 августа 2010

Вы можете использовать alias_method.

alias_method :orig_hello, :hello
def hello
  puts "Hello!"
  orig_hello
end
0 голосов
/ 27 мая 2016

Как уже говорили другие, def это не метод, это ключевое слово.Вы не можете "переопределить" это.Однако вы можете определить метод с именем «def» с помощью магии метапрограммирования Ruby:

define_method :def do
  puts "this is a bad idea"
end

Это все равно не заменит ключевое слово def, но вы можете вызвать новый метод с помощью method(:def).call.

Итак, у вас (вроде) это есть.

Примечание: я понятия не имею, почему вы захотите определить метод с именем def.Не делай этого.

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