SORU
9 EKİM 2008, PERŞEMBE


Ruby: define_method vs def

Programlama bir egzersiz olarak, bir sınıf oluşturur, bu sınıftan iki nesne oluşturur, bir nesne monkeypatches, diğeri monkeypatch için method_missing dayanan Ruby parçacığı yazdım.

İşte anlaşma. Bu beklendiği gibi çalışır:

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 için bir parametre olduğunu fark edeceksiniz. Dinamik olarak uygun bir adla eksik yöntemleri oluşturmak için define_method kullanmayı umuyordum, çünkü bunu ben yaptım. Ancak, işe yaramıyor. Hatta statik bir adı ile define_method kullanarak şu şekilde:

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

Aşağıdaki sonuç ile sona erer

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.

Hata mesajı daha şaşırtıcı kılan sadece 8 *...* için bir argüman var

CEVAP
9 EKİM 2008, PERŞEMBE


define_method nesne (özel) bir yöntemdirSınıf. Bir şey diyorsunörnek. Yok örnek yöntemi denir define_method, yinelenir için method_missing Bu kez :define_method (adı eksik yöntem), ve :screech (tek bağımsız değişken geçirildi define_method).

Bunun yerine (tüm Maymun nesneleri yeni yöntemi tanımlamak için deneyin:

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

Ya bu (üzerine, nesnenin kullanarak denen nesne sadece tanımlamak için"") eigenclass:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • Malwarebytes

    Malwarebytes

    22 Temmuz 2007
  • ShoSho

    ShoSho

    20 Ocak 2010