Frage

Dieser Artikel erwähnt 4 Möglichkeiten, Procs in Ruby 1.9 aufzurufen, und === ist eine davon.Ich verstehe nicht, warum das überhaupt so gemacht wird.Hat es irgendeine Beziehung zur normalen Bedeutung von === (fragt, ob die beiden Objekte dasselbe Objekt sind)?

irb(main):010:0> f =-> n {[:hello, n]}
=> #
irb(main):011:0> f.call(:hello)
=> [:hello, :hello]
irb(main):012:0> f === :hello
=> [:hello, :hello]
irb(main):013:0> Object.new === Object.new
=> false
irb(main):014:0> f === f
=> [:hello, #]
War es hilfreich?

Lösung

Das sagen die Dokumente:

Es soll einem proc-Objekt ermöglichen, ein Ziel zu sein when Klausel in der Fallerklärung.

Dies ist ein vielleicht erfundenes Beispiel:

even = proc { |x| x % 2 == 0 }
n = 3
case n
when even
  puts "even!"
else
  puts "odd!"
end

Es funktioniert, weil die case/when wird grundsätzlich so ausgeführt:

if even === n
  puts "even!"
else
  puts "odd!"
end

Der case/when prüft durch Aufruf, welcher Zweig ausgeführt werden soll === zu den Argumenten dazu when Klauseln, wobei die erste Klausel ausgewählt wird, die einen wahrheitsgemäßen Wert zurückgibt.

Trotz seiner Ähnlichkeit mit dem Gleichheitsoperator (==) Es ist keine stärkere oder schwächere Form davon.Ich versuche darüber nachzudenken === Operator als „gehört zu“-Operator. Class Definiert es, damit Sie überprüfen können, ob es sich um ein Objekt handelt gehört die Klasse (d.h.ist eine Instanz der Klasse oder eine Unterklasse der Klasse), Range Definiert es so, dass überprüft wird, ob das Argument vorhanden ist gehört die Reichweite (d.h.ist im Sortiment enthalten) und so weiter.Das macht es nicht wirklich Proc Fall macht mehr Sinn, aber betrachten Sie es als ein Werkzeug, mit dem Sie Ihr eigenes erstellen können gehört Operatoren, wie mein Beispiel oben;Ich habe ein Objekt definiert, das bestimmen kann, ob etwas ist gehört die Menge der geraden Zahlen.

Andere Tipps

Beachten Sie, dass der === in Ruby nicht um Gleichheit ist, im Gegensatz zu JavaScript.Es wird speziell verwendet für Fallausdrücke :

generasacodicetagpre.

Diese Funktion ist nützlich für den Fall, wenn Sie beim Vergleich etwas berechnen müssen.

generasacodicetagpre.

Hat es irgendeine Beziehung zur normalen Bedeutung von === (fragt, ob die beiden Objekte dasselbe Objekt sind)?

Eigentlich ist das ein weit verbreitetes Missverständnis darüber === in Ruby.Es ist eigentlich nicht unbedingt dafür Object#object_id Vergleich (obwohl dies bei vielen gängigen Aufrufen der Fall ist).In Ruby, === ist der Fall Subsumtion.

Hier ist die Beschreibung von === aus Object:"Fallgleichheit - für Klassenobjekte, effektiv das gleiche wie das Aufrufen von #==, aber typischerweise von Nachkommen überschrieben, um für Fallanweisungen eine sinnvolle Semantik bereitzustellen."

Leider, obwohl es aus drei besteht =, mit Gleichberechtigung hat es nicht im Entferntesten etwas zu tun :-D

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top