Stenografia a rubino, artoo.io
Domanda
Sto cercando una spiegazione per quello che sta succedendo in cima a artoo.io robot.C'è una dichiarazione in cima a questo esempio usando il driver della tastiera:
require 'artoo'
connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard
.
Sembra che venga visualizzata qualche stenografia / sintassi alternativa e mi piacerebbe una spiegazione di quella stenografia.Capisco la sintassi del hash alternativa: :adapter => :keyboard
.
Cosa sta succedendo in quelle ultime due linee di codice sopra?Cos'è connection
?È una classe all'interno del artoo
che viene inizializzata?Perché non c'è new
?Da dove viene :keyboard
?Se c'è una sintassi alternativa che rappresenta le relazioni in modo più esplicito, potresti mostrarlo anche?
Soluzione
Questa è una grande domanda. Potrebbe essere un duplicato ma non riuscivo a trovarne uno e questo è il genere di cose che sono ingannevoli per i programmatori intelligenti che sono nuovi a rubino.
Primo, alla tua domanda: cos'è connection
?
È una chiamata del metodo . In alcuni casi può essere difficile dire cosa è un metodo e qual è una variabile, perché dipende solo da come sono state definite. Ma in questo caso è chiaro perché connection
ha parametri dopo di esso. In Ruby, un metodo può essere chiamato come questo:
foo
.
In tal caso è un metodo che non richiede parametri. Oppure può sembrare questo:
foo 1, 2, 3
.
Questo è un metodo con tre parametri. Oppure può sembrare questo:
foo(1, 2, 3)
.
Questo è lo stesso metodo, ma con una sintassi leggermente diversa (che è più familiare alle persone esperienze in lingue c-mimile come c, c ++, java, javascript, c #, ecc ...)
Quindi quando vedi i parametri elencati dopo una parola nuda, senza operatori tra, è un segno sicuro che è una chiamata di metodo.
Ora per abbattere il tuo codice interamente.
require 'artoo'
.
Questo è tecnicamente una chiamata di metodo. Stai chiamando il metodo require
e passando un singolo parametro della stringa letterale 'artoo'
. Come probabilmente lo sai, require
caricano un file rubino esterno nel file corrente.
connection :keyboard, adaptor: :keyboard
.
Questa è una chiamata di metodo con alcuni zucchero sintattico :
Sai subito che connection
è una chiamata di metodo perché ha parametri dopo di esso (cioè nessun operatore tra connection
e cosa arriva dopo). Ma quali parametri?
:keyboard
: è un simbolo , che è l'equivalente di Ruby di un Stringa Intern'd .
adaptor: :keyboard
è un hash .
Ruby ha due sintassi di hash primari:
{key => value}
.
Dove key
e value
sono qualsiasi oggetto o:
{key: value}
.
Dove key
è un simbolo letterale nudo e value
è qualsiasi oggetto. Inoltre, per mantenere il codice pulito, quando si passa un hash come Ultimo parametro su un metodo, è possibile lasciare il {
e }
perché non è ambigua. Finisce per darti un metodo di stile "Named Named Parameter" pulito:
do_something_to my_person, kindness: 10, aggressiveness: 2
.
Nel tuo codice:
connection :keyboard, adaptor: :keyboard
.
Hai la sintassi del hash alternativo (tasti di simbolo) con il {
e il }
è stato interrotto. L'intera linea è equivalente al 100% a:
connection(:keyboard, {:adaptor => :keyboard})
.
La tua ultima riga:
device :keyboard, driver: :keyboard, connection: :keyboard
.
è la stessa cosa. Equivalente a:
device(:keyboard, {:driver => :keyboard, :connection => :keyboard})
.
Sembra semplicemente più bello (una volta abituato ad esso).
Altri suggerimenti
Nell'esempio, connection
e device
sono metodi.I bit adapter: :keyboard
, driver: :keyboard
e :connection: :keyboard
Bit sono parametri passati come hash a tali metodi.I primi parametri passati alla connessione () e al dispositivo () non vengono passati in un hash.
Lo stesso codice potrebbe essere riscritto come questo:
connection :keyboard, { adaptor => :keyboard }
device :keyboard, { driver => :keyboard, connection => :keyboard }
.