Ruby: define_method против def

Как упражнение по программированию, яМы написали фрагмент Ruby, который создает класс, создает два объекта из этого класса, monkeypatches один объект и полагается на method_missing, чтобы monkeypatch другой.

Вот'сделка Это работает как задумано:

class Monkey

  def chatter
    puts "I am a chattering monkey!"
  end

  def method_missing(m)
    puts "No #{m}, so I'll make one..."
    def screech
      puts "This is the new screech."
    end
  end
end

m1 = Monkey.new
m2 = Monkey.new

m1.chatter
m2.chatter

def m1.screech
  puts "Aaaaaargh!"
end

m1.screech
m2.screech
m2.screech
m1.screech
m2.screech

Вы'Заметьте, что у меня есть параметр для method_missing. Я сделал это, потому что надеялся использовать define_method для динамического создания отсутствующих методов с соответствующим именем. Тем не менее, это нет работа. На самом деле, даже используя define_method со статическим именем, вот так:

def method_missing(m)
  puts "No #{m}, so I'll make one..."
  define_method(:screech) do
    puts "This is the new screech."
  end
end

Заканчивается следующим результатом:

ArgumentError: wrong number of arguments (2 for 1)

method method_missing   in untitled document at line 9
method method_missing   in untitled document at line 9
at top level    in untitled document at line 26
Program exited.

Что делает сообщение об ошибке более удивительным, так это то, что у меня есть только один аргумент дляmethod_missing...

Ответы на вопрос(3)

Ваш ответ на вопрос