2009-05-24 14 views
2

ich lerne derzeit Ruby und RoR und ich auf diese Erklärung gestolpert:Warum sind diese Standardparameter so definiert, wie sie sind?

link_to_remote(name, options = {}, html_options = nil) 

Ich entdeckte, dass dieses Muster auf mehrere andere Rails Funktionen verwendet wird.

Warum sind die Standardwerte auf diese Weise definiert? Warum nicht einer von diesen beiden?

... options = {}, html_options = {}) 
... options = nil, html_options = nil) 

Ist das eine Art Konvention, die ich auch in meinen eigenen Funktionen befolgen sollte?

Antwort

1

Die Methode wie folgt definiert ist:

link_to_function(name, remote_function(options), html_options || options.delete(:html)) 

auf diese Weise können Sie die html_options als Teil des options Hash spezifizieren, anstatt als separate Parameter. Auf der anderen Seite wird der Hash options immer an remote_function übergeben, also brauchen wir es.

Es ist auch ein wenig effizienter, das Singleton-Nil zu verwenden, als ein Array zu konstruieren, das niemals bei jedem Aufruf der Methode verwendet wird. Ich würde nicht sagen, dass dieser Grund so zwingend ist, dass ich {} nicht verwenden würde, wenn er den resultierenden Code sauberer machen würde, aber in Ermangelung anderer Überlegungen erscheint es logisch, das zu tun.

0

Kein Experte dafür, aber für options könnte es sein, weil der aufrufende Code die merge Methode verwendet, um alles, was Sie übergeben, mit den angenommenen Standardwerten zu kombinieren; Setzen Sie es auf nil würde nur alle Optionen entfernen. Ich bin nicht sicher über html_options, aber es könnte etwas ähnliches sein.

html_options kann einen Block aufrufen und etwas definiert haben, um zu überprüfen, ob es einen Hashwert gibt oder nicht. Wie ich schon sagte, ich bin kein Experte, aber das könnte der Grund sein. Ich habe gerade eine Ubuntu-VM überprüft, und laut irb wird ein leerer Hashwert zu true ausgewertet, also könnte das der Grund sein. Der Aufrufcode verwendet wahrscheinlich einen Block mit etwas Zeile:

if html_options 
    # do stuff 
end 

so ist es nil standardmäßig, da der Code ausführen würde und Sie wahrscheinlich eine Null-Fehler geben, mit einem leeren Hash

Verwandte Themen