2015-11-16 13 views
6

Ruby 2.3.0 introduce la sintassi di navigazione sicura che facilita la gestione nil delle chiamate al metodo concatenate introducendo un nuovo operatore che chiama il metodo solo se il valore dell'istruzione precedente non è nil. Questa è una funzionalità che esiste già ad esempio in C#, Groovy e Swift. Ad esempio in Groovy, la sintassi èPerché Ruby utilizza la propria sintassi per un operatore di navigazione sicuro?

foo?.bar 

che sostanzialmente significa che il valore del risultato è quello di foo.bar meno foo è nullo, nel qual caso il valore di ritorno è anche nullo e quindi nessuna eccezione viene lanciata. Anche C# (chiamato operatori con condizionalità nullo) e Swift (chiamato espressione di concatenamento opzionale) utilizzare questa notazione.

Quindi la sintassi sembra essere abbastanza standard in altre lingue. Ora, perché in Ruby la sintassi è

foo&.bar 

?

+4

'pippo? .bar' significa" chiama metodo 'pippo?", Quindi chiama metodo 'bar' sul risultato". La versione 2.3.0 è una versione compatibile con le versioni precedenti, la tua sintassi proposta si tradurrebbe in ** massiccia ** rottura, avrebbe * almeno * bisogno di un paio di anni di avviso di deprecazione prima che potesse essere introdotta. –

risposta

11

Questa risposta è basata su the discussion of the feature request nel monitoraggio dei problemi di Ruby. Secondo Ruby's author Yukihiro Matsumoto non sarebbe possibile introdurre l'operatore ?. in Ruby perché foo? è un nome di metodo valido e quindi non è stato possibile analizzare. Il primo candidato per operatore era la sequenza inversa .?. Questa sintassi era already implemented (di Nobuyoshi Nakada), ma in seguito fu scartata poiché si pensava che fosse troppo vicina alla sintassi originale introdotta dagli altri linguaggi (che non era fattibile come menzionato prima). La sintassi finale &. è stata accettata come suggested da Matsumoto.

Ecco la giustificazione per questa sintassi dato da Matsumoto

penso a questo per un po ', e il pensiero di introdurre &. invece di .?, perché:

  • .? è simile a ?. in Swift e altre lingue, ma è diverso comunque.
  • Poiché ? è un suffisso valido dei nomi dei metodi in Ruby, nei nostri programmi vediamo già molti punti interrogativi.
  • u&.profile ci ricorda come forma abbreviata di u && u.profile.

Ma il comportamento di &. dovrebbe essere mantenuto, cioè esso dovrebbe saltare nil ma riconoscere false.

Questa sintassi è stata quindi rilasciata come parte di Ruby 2.3.0-preview1.

+2

Se si desidera che la risposta non sia una copia e incolla senza significato ma una risorsa utile, non è necessario citare testualmente la discussione; dovresti almeno correggere gli errori grammaticali in esso contenuti (usando i segni editoriali come '[]'), o meglio, riformattalo con parole tue. Inoltre non è chiaro cosa significhi "salta' nil' ma riconosca 'false'". Puoi chiarire cosa significa? Senza di esso, la tua domanda e risposta è solo una copia della discussione, e non vedo alcun valore in essa. – sawa

+1

Matz spiega anche questa stessa giustificazione per questa scelta dell'operatore nel suo discorso di apertura di RubyConf 2015. Potrebbe essere più comprensibile guardare il video rispetto alle segnalazioni di bug di riferimento. Egli indica che il '& .' è chiamato" operatore solitario "(con un po 'di immaginazione, può essere visto apparire come una persona sola seduta sul pavimento che fissa il punto davanti a loro). Vedi le diapositive 78-87, tra le 15:00 e le 17:40 [video keynote di YouTube] (https://www.youtube.com/watch?v=LE0g2TUsJ4U) –