2010-08-10 4 views
3

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

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

sub_def hello 
    puts "Hello!" 
    super 
end 

def hello 
    puts "cruel world." 
end 

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

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

ответ

6

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

+0

Спасибо. Я думаю, мне лучше использовать некоторые DSL-блоки;) –

1

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

alias_method :orig_hello, :hello 
def hello 
    puts "Hello!" 
    orig_hello 
end 
1

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

def hello 
    puts "Hello" 
    yield if block_given? 
end 

hello do 
puts "cruel world" 
end 
0

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

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

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

Итак, у вас (вида) есть.

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