2016-06-04 21 views
0

Ich habe ein Juwel (z. B. mygem) und wie üblich, ich füge mygem zu einer Datei, indem require "mygem" an der Spitze. Was passiert, wenn ich eine Methode in mygemfinish_jobs genannt haben und ich es in der folgenden Position ausgeführt werden soll:Wie kann ich eine Methode am Ende einer Datei von einem Juwel aus ausführen?

require "mygem" 
# code, code code 
finish_jobs 

Wie würde ich tun, dass der Benutzer, ohne dass die Methode jedes Mal, sie nutzen den Edelstein hinzufügen?

Genauer gesagt, was ich versuche zu schreiben ist eine Server-App (mit Rack) und ich brauche die Methoden im Körper der Datei verarbeitet werden, bevor der Server gestartet wird.

+0

Ist "code code code", wo Sie Ihren Server starten? –

+0

'code code code' wäre, wo ich verschiedene Teile meines Servers einstellen würde, die eingerichtet werden müssen, bevor ich es starte. – thesecretmaster

+0

Ich denke, du solltest eine config.rb schreiben, die das tut, was du brauchst, und das umgestalten. –

Antwort

1

Dies ist sicherlich möglich.

Warum nicht einfach den Code direkt in das Gem einfügen (da es sich anhört, als wäre es unter Ihrer Kontrolle und ist keine externe Abhängigkeit)?

module MyGem 
    def printSomething 
    p 2 + 2 
    end 

    module_function :printSomething 
    printSomething() 
    # => 4 
end 

Wenn dies nicht das ist, woran Sie gedacht haben, lassen Sie es mich wissen und ich kann die Lösung aktualisieren.

Auch sehen Kernel#at_exit
Eine erläuternde Anleitung auf Kernel#at_exit

+0

eine andere Möglichkeit wäre, nach einer Rückkehr von 'main' oder was auch immer das globale Objekt ist (wo der Code geschrieben ist) zu prüfen - obwohl sich der Name ändern würde, abhängig davon, wo es ausgeführt wird (irb, etc) – Trajanson

0

Ich weiß nicht, von einer Art und Weise zu tun, was Sie beschreiben.

Eine Problemumgehung wäre die Bereitstellung einer API, die einen Block akzeptiert. Mit diesem Ansatz können Sie den Code nach dem Setup des Benutzers ausführen, ohne die Implementierungsdetails anzuzeigen.

könnte ein Benutzer Ihrer Bibliothek Methode aufrufen, einen Block Bereitstellung von ihrem Server einzurichten:

require "mygem" 

MyGem.code_code_code { 
    # user's code goes here 
} 

Dann würde der Bibliothekscode:

  • einige Bibliothek den Block Accept
  • Anruf Code

Hier ist eine Beispielimplementierung:

module MyGem 
    # Run some user-provided code by `yield`-ing the block 
    # Then run the gem's finalizer 
    def self.code_code_code 
    # Execute the block: 
    yield 
    # Finalize: 
    finish_jobs 
    end 
end 

Auf diese Weise können Sie Code vom Benutzer akzeptieren, aber immer noch Setup und Finalisierung steuern.

Ich hoffe, es hilft!

+0

es gibt eine Möglichkeit, dies zu tun, wenn ich mehrere Block-Methoden habe, dann, nachdem der Code ausgeführt wird, dann meine Funktion ausführen? – thesecretmaster