2016-12-09 13 views
2

Ich war der docs des Sequel zu lesen und ich bin gespannt auf die Technik in den folgenden Codeausschnitt verwendet bekam:Wie erreiche ich dieses Ergebnis in Rubin?

class Post < Sequel::Model(:my_posts) 
    (...) 
end 

Die Sequel::Model(:my_posts) setzt die Datenbanktabelle für das Modell. Ich interessiere mich speziell für die Klammer in Model(:my_posts). Ich mag diese Schnittstelle, aber wie kann ich das erreichen? Es ist ein bisschen komisch ... Scheint wie die Model kann als eine Methode aufgerufen werden ... Was ist diese Technik? Kann mir jemand ein Beispiel geben?

+0

Dies ruft nur die Methode mit dem Namen 'Model' auf dem Objekt auf, das durch die Konstante' Sequel' referenziert wird, wobei das 'Symbol'': my_posts' als Argument übergeben wird. Diese Methode gibt vermutlich eine Instanz der 'Class' Klasse zurück, ansonsten erhalten Sie einen' TypeError'. –

Antwort

4

Normalerweise, wenn Sie :: mit Modul oder Klasse verwenden, wird Ruby versuchen, Ausdruck nach :: in Konstanten zu finden.

Example::First => as constant 
Example::First() => as method 

Führen Sie diesen Code:

module Example 
    class << self 
    def First(a) 
     puts a 
    end 
    end 

    module First 
    end 
end 

Verbrauch:

Example::First(1) # => prints 1 

Wenn Sie class << self Sie öffnen sich die Klasse verwenden, so dass Methoden können für das aktuelle Selbstobjekt (die in einem neu definiert werden Klasse oder Modulkörper ist die Klasse oder das Modul selbst). Lesen Sie gut question/answers auf SO.

Es ist gute Praxis, die zwar nicht zwingend, die Methodennamen mit ein Kleinbuchstabe zu beginnen, weil die Namen, die mit Großbuchstaben beginnen Konstanten in Ruby sind. Es ist immer noch möglich, einen konstanten Namen für ein Verfahren zu verwenden, aber Sie werden es nicht ohne Klammern aufrufen Lage sein, , weil die interpeter wird für den Namen Nachschau als Konstante

Von What are the restrictions for method names in Ruby?

+0

Sequel definierte eine Methode 'def_model' (siehe [hier] (http://sequel.jeremyevans.net/rdoc/classes/Sequel/Model/ClassMethods.html#method-i-def_Model)), um eine Model-Methode für eine beliebige Methode zu definieren gegebenes Modul – user3033467

Verwandte Themen