Ruby - Modul :: NoMethodError
Ich habe ein Modul wie dieses:
module Prober
def probe_invoke(type, data = {})
p = Probe.new({:probe_type => type.to_s,
:data => data.to_json, :probe_status => 0, :retries => 0})
p.save
end
end
Und ich bin versucht, Zugriff auf diese aus meinem main-Programm wie dieses:
require 'prober'
Prober.probe_invoke("send_sms", sms_text)
Aber es erzeugt Fehler:
undefined method `probe_invoke' für
Prober:Modul (NoMethodError)
InformationsquelleAutor der Frage Sayuj | 2011-06-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abgesehen von den Antworten, die Ihnen die Möglichkeit geben, definieren der Funktion als
self.
haben Sie eine andere option, einschließlich der Modul-und aufrufen, ohne das Modul, Referenz, wie diese:und man kann es so nennen:
InformationsquelleAutor der Antwort rubyprince
Der einfachste Weg ist, um Ihre Methode in ein Modul-level-Methode:
def self.probe_invoke
würde auch funktionieren, weil zu der Zeit, dass die Zeile ausgeführt wird, wirdself
ist die Modul-definition.InformationsquelleAutor der Antwort Gareth
Neben den Antworten hier kannst du auch Folgendes tun:
Den
class << self
block definieren auch jede Methode, die als Instanz-Methoden des Moduls.(Diese Funktionalität ist die gleiche, wie zu definieren, die jedes einzelne Methoden von
def Prober.mymethod ...
oderdef self.mymethod ...
)Update (2014-11-22)
Entsprechend dem Ruby Style Guide Sie sollten mit
module_function
statt:Ich würde Sie anrufen und diese utility Module.
BTW: In der Vergangenheit war es häufiger zu verwenden
extend self
statt Umbruch der Methoden in einemclass << self
block.Ich auch angepasst, der code oben, um anderen style guide Empfehlungen.
InformationsquelleAutor der Antwort asaaki
Die Antwort ist:
Weil sonst definieren Sie die Methode wie eine Instanz-Methode des Moduls, aber Sie wirklich wollen, es zu definieren statisch.
InformationsquelleAutor der Antwort grundprinzip