125 Stimmen

Ruby optionale Parameter

Wenn ich eine Ruby-Funktion wie folgt definiere:

def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )

Wie kann ich sie aufrufen und nur die ersten 2 und den letzten Argumente übergeben? Warum ist etwas wie

ldap_get( base_dn, filter, , X)

nicht möglich oder wenn es möglich ist, wie kann es gemacht werden?

137voto

jshen Punkte 10827

Sie sind fast immer besser dran, wenn Sie einen Options-Hash verwenden.

def ldap_get(base_dn, filter, options = {})
  options[:scope] ||= LDAP::LDAP_SCOPE_SUBTREE
  ...
end

ldap_get(base_dn, filter, :attrs => X)

23 Stimmen

Eine gängige Strategie ist es, einen Standard-Options-Hash zu haben und das, was übergeben wurde, zusammenzuführen: options = default_options.merge(options)

7 Stimmen

Ich rate davon ab, da die Optionen nicht angeben, was die Methode erwartet oder was die Standardwerte sind.

131voto

tomafro Punkte 5718

Dies ist mit Ruby derzeit nicht möglich. Sie können keine 'leeren' Attribute an Methoden übergeben. Das Nächste, was Sie tun können, ist, nil zu übergeben:

ldap_get(base_dn, filter, nil, X)

Dies setzt jedoch den Bereich auf nil, nicht LDAP::LDAP_SCOPE_SUBTREE.

Was Sie tun können, ist den Standardwert innerhalb Ihrer Methode festzulegen:

def ldap_get(base_dn, filter, scope = nil, attrs = nil)
  scope ||= LDAP::LDAP_SCOPE_SUBTREE
  ... etwas machen ...
end

Jetzt, wenn Sie die Methode wie oben aufrufen, wird das Verhalten wie erwartet sein.

22 Stimmen

A little gotcha with this method: z.B. Wenn Sie versuchen, den Standardwert für scope auf true zu setzen und Sie false übergeben, wird scope ||= true nicht funktionieren. Es wird genauso wie nil ausgewertet und auf true gesetzt.

4 Stimmen

Ist es mit der aktuellen Version von Ruby, 3 Jahre nach dieser Antwort, möglich?

1 Stimmen

@JoshPinter, gute Erklärung. Grundsätzlich bedeutet ||= nicht a = b oder c, ich habe mich geekelt, als ich xyz||=true gesehen habe. Es besagt, dass, wenn es nil ist, es immer wahr ist. Wenn es wahr ist, ist es wahr.

54voto

steenslag Punkte 75941

Die Zeit ist vergangen und seit Version 2 unterstützt Ruby benannte Parameter:

def ldap_get ( base_dn, filter, scope: "some_scope", attrs: nil )
  p attrs
end

ldap_get("erstes_arg", "zweites_arg", attrs: "attr1, attr2") # => "attr1, attr2"

1 Stimmen

Sie können auch ein doppeltes Sternchen verwenden, um zusätzliche nicht definierte Stichwortargumente zu sammeln. Dies hängt mit diesem Thema zusammen: stackoverflow.com/a/35259850/160363

3voto

Chris Bunch Punkte 83897

Es ist nicht möglich, es auf die Weise zu tun, wie du ldap_get definiert hast. Allerdings, wenn du ldap_get so definierst:

def ldap_get ( base_dn, filter, attrs=nil, scope=LDAP::LDAP_SCOPE_SUBTREE )

Dann kannst du jetzt:

ldap_get( base_dn, filter, X )

Jetzt hast du jedoch das Problem, dass du es nicht mit den ersten beiden Argumenten und dem letzten Argument aufrufen kannst (das gleiche Problem wie zuvor, aber jetzt ist das letzte Argument anders).

Der Grund dafür ist einfach: In Ruby muss nicht jedes Argument einen Standardwert haben, sodass du es nicht so aufrufen kannst, wie du es angegeben hast. In deinem Fall haben die ersten beiden Argumente beispielsweise keine Standardwerte.

1voto

rupweb Punkte 2597

1) Sie können die Methode nicht überladen (Warum unterstützt Ruby keine Methodenüberladung?), warum also nicht eine neue Methode schreiben?

2) Ich habe ein ähnliches Problem mit dem Splat-Operator * für ein Array der Länge null oder mehr gelöst. Dann, wenn ich einen Parameter übergeben möchte, kann ich das, es wird als Array interpretiert, aber wenn ich die Methode ohne Parameter aufrufen möchte, muss ich nichts übergeben. Siehe Ruby-Programmiersprache Seiten 186/187

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X