2012-03-25 9 views
1

Ruby syntax reference sagt über case-Anweisungen:Warum ist "foo" nicht === zu/foo/wenn die Übereinstimmung in einem Fall erfolgreich ist?

ruby -e 'puts (1..3) === 2' 

druckt true, aber:

ruby -e 'puts "foo" === /foo/' 

Vergleiche von Operator ===

infact, zum Beispiel getan werdendruckt false, und auch:

ruby -e 'puts :foo === /foo/' 

druckt false, aber alle diese Beispiele sind erfolgreiche Bedingungen für Case-Anweisungen. Wie funktioniert es?

+0

Versuchen Sie '/ foo/===" foo "'. Verändert sich Ihre Vorstellung davon, wie "Case" funktioniert? Denken Sie daran, dass nur der * Empfänger * in Ruby implizit polymorph ist und dass "a === b" effektiv "a .__ send __ (: ===, b)" ist. –

+0

Ich habe nicht über Ordnung nachgedacht>. mdesantis

Antwort

7

Der Operator === ist nicht kommutativ, was bedeutet, dass "foo" === /foo/ und /foo/ === "foo" zwei sehr unterschiedliche Dinge sind. Und case Anweisungen verwenden die letztere Reihenfolge.

Tatsächlich zeigt Ihr erstes Beispiel, das einen Bereich verwendet, bereits, dass diese Reihenfolge verwendet wird. 2 === (1..3) würde nicht funktionieren, genauso wie Ihr zweites und drittes Beispiel nicht.

Der Grund, dass Reihenfolge gewählt wird, ist auch offensichtlich, zumindest wenn Sie damit vertraut sind, wie Operatoren in Ruby und OO Design im Allgemeinen funktioniert.

Der === Operator ist ein normales Verfahren, so eine andere Art und Weise /foo/ === "foo" des Schreibens ist /foo/.===("foo") - Und diese Ordnung macht Sinn, weil ein regulärer Ausdruck nicht wissen, ob es eine Zeichenfolge übereinstimmt, aber eine Zeichenfolge hat kein Konzept für reguläre Ausdrücke und doesn‘ Ich weiß, ob es mit einem übereinstimmen würde. Verlängert auf Ihr erstes Beispiel, weiß ein Bereich, ob ein Element ein Teil davon ist, aber ein Element hat keine Ahnung, ob es Teil eines Bereichs ist.

+0

Ich fühlte, dass mir etwas offensichtlich fehlte. Vielen Dank – mdesantis

Verwandte Themen