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?

È stato utile?

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 }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top