Wenn ich eine Ruby-Funktion wie folgt definiere:
def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Wie kann ich es so nennen, dass es nur die ersten 2 und die letzten Argumente liefert? Warum ist so etwas nicht
ldap_get( base_dn, filter, , X)
möglich oder wenn es möglich ist, wie kann es gemacht werden?
ruby
optional-parameters
Bruno Antunes
quelle
quelle
scope
true festzulegen und übergebenfalse
,scope ||= true
funktioniert dies nicht. Es wertet das gleiche ausnil
und wird es auftrue
xyz||=true
. Es heißt, wenn es Null ist, ist es immer wahr. Wenn es wahr ist, ist es wahr.scope ||= true
ist, bin ich überrascht, dass niemand erwähnt hat, dass der bessere Weg dies zu tun istscope = LDAP::LDAP_SCOPE_SUBTREE if scope.nil?
. Selbst das setzt natürlich voraus, dass diesnil
ein ungültiger Wert ist.nil
. Einige mögen vielleicht die Notation:ldap_get(base_dn, filter, _, X)
(Anmerkung: Ich weiß (noch) nicht, wann dies in Ruby eingeführt wurde. Interessanter SO-Thread ).Sie sind fast immer besser dran, wenn Sie einen Options-Hash verwenden.
quelle
options = default_options.merge(options)
Die Zeit ist weitergegangen und seit Version 2 unterstützt Ruby benannte Parameter:
quelle
Es ist nicht möglich, es so zu machen, wie Sie es definiert haben
ldap_get
. Wenn Sie jedoch Folgendes definierenldap_get
:Jetzt kannst du:
Aber jetzt haben Sie das Problem, dass Sie es nicht mit den ersten beiden Argumenten und dem letzten Argument aufrufen können (das gleiche Problem wie zuvor, aber jetzt ist das letzte Argument anders).
Der Grund dafür ist einfach: Jedes Argument in Ruby muss keinen Standardwert haben, daher können Sie es nicht so nennen, wie Sie es angegeben haben. In Ihrem Fall haben beispielsweise die ersten beiden Argumente keine Standardwerte.
quelle
1) Sie können die Methode nicht überladen ( Warum wird die Ruby-Methode nicht überladen? ). Warum also nicht eine neue Methode schreiben?
2) Ich habe ein ähnliches Problem mit dem Splat-Operator * für ein Array mit einer Länge von null oder mehr gelöst. Wenn ich dann einen oder mehrere Parameter übergeben möchte, wird dieser als Array interpretiert. Wenn ich die Methode jedoch ohne Parameter aufrufen möchte, muss ich nichts übergeben. Siehe Ruby Programming Language- Seiten 186/187
quelle
Kürzlich habe ich einen Weg gefunden, dies zu umgehen. Ich wollte eine Methode in der Array-Klasse mit einem optionalen Parameter erstellen, um Elemente im Array beizubehalten oder zu verwerfen.
Ich habe dies simuliert, indem ich ein Array als Parameter übergeben und dann überprüft habe, ob der Wert an diesem Index Null war oder nicht.
Probieren Sie unsere Klassenmethode mit verschiedenen Parametern aus:
Ausgabe:
["1", "2", "a", "b", "c"]
Okay, cool, das funktioniert wie geplant. Lassen Sie uns nun überprüfen, was passiert, wenn wir die dritte Parameteroption (1) im Array nicht übergeben.
Ausgabe:
["a", "b", "c"]
Wie Sie sehen können, wurde die dritte Option im Array entfernt, wodurch ein anderer Abschnitt in der Methode eingeleitet und alle ASCII-Werte entfernt wurden, die nicht in unserem Bereich liegen (32-126).
Alternativ hätten wir den Wert in den Parametern als Null ausgeben können. Welches würde ähnlich wie der folgende Codeblock aussehen:
quelle
Es ist möglich :) Ändern Sie einfach die Definition
zu
Der Bereich wird nun an erster Stelle im Array sein. Wenn Sie 3 Argumente angeben, haben Sie base_dn, filter und attrs zugewiesen, und param_array ist []. Wenn 4 und mehr Argumente vorhanden sind, ist param_array [argument1, or_more und_more].
Nachteil ist ... es ist eine unklare Lösung, wirklich hässlich. Dies ist zu beantworten, dass es möglich ist, Argumente in der Mitte des Funktionsaufrufs in Ruby auszulassen :)
Eine andere Sache, die Sie tun müssen, ist, den Standardwert des Bereichs neu zu schreiben.
quelle
attrs=nil
nach einem splat (*param_array
) einen Standardwertparameter ( ) zu verwenden.¶meter
, in Ruby 1.9 konnten jedoch auch "normale Parameter" folgen. In keinem Fall war ein Parameter mit einem Standardwert nach einem Parameter mit einem Splat zulässig.Sie können dies mit einer Teilanwendung tun, obwohl die Verwendung benannter Variablen definitiv zu besser lesbarem Code führt. John Resig schrieb 2008 einen Blog-Artikel darüber, wie man das in JavaScript macht: http://ejohn.org/blog/partial-functions-in-javascript/
Es wäre wahrscheinlich möglich, dasselbe Prinzip in Ruby anzuwenden (mit Ausnahme der prototypischen Vererbung).
quelle