Taquigrafía en Ruby, Artoo.io
Pregunta
Estoy buscando una explicación para lo que está pasando en la parte superior de artoo.io robots.Hay una declaración al principio de este ejemplo que utiliza el controlador del teclado:
require 'artoo'
connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard
Parece que se muestra alguna sintaxis taquigráfica/alternativa y me encantaría recibir una explicación de esa taquigrafía.Entiendo la sintaxis hash alternativa: :adapter => :keyboard
.
¿Qué está pasando en esas dos últimas líneas de código anteriores?Qué es connection
?¿Es una clase adentro? artoo
que se está inicializando?¿Por qué no hay new
?Donde hace :keyboard
¿viene de?Si existe una sintaxis alternativa que represente las relaciones de manera más explícita, ¿podría mostrarla también?
Solución
Esta es una gran pregunta.Puede que sea un duplicado, pero no pude encontrar ninguno y este es el tipo de cosas que resultan complicadas para los programadores inteligentes que son nuevos en Ruby.
Primero, a tu pregunta:Qué es connection
?
Es un llamada al método.En algunos casos puede resultar difícil saber qué es un método y qué es una variable, porque sólo depende de cómo se definieron.Pero en este caso está claro porque connection
tiene parámetros después de él.En Ruby, un método se puede llamar así:
foo
En ese caso es un método que no toma parámetros.O puede verse así:
foo 1, 2, 3
Ese es un método con tres parámetros.O puede verse así:
foo(1, 2, 3)
Ese es el mismo método, pero con una sintaxis ligeramente diferente (que es más familiar para las personas con experiencia en lenguajes que imitan c como c, C++, Java, Javascript, C#, etc.)
Entonces, cuando vea parámetros listados después de una palabra simple, sin operadores entre ellos, es una señal segura de que es una llamada a un método.
Ahora para desglosar su código por completo.
require 'artoo'
Esto es técnicamente una llamada a un método.Estás llamando al require
método y pasando un único parámetro de la cadena literal 'artoo'
.Como probablemente sabes, require
carga un archivo Ruby externo en el archivo actual.
connection :keyboard, adaptor: :keyboard
Esta es una llamada a un método con algunos azúcar sintáctica:
Sabes de inmediato que connection
es una llamada a un método porque tiene parámetros después (es decir,ningún operador entre connection
y lo que viene después).¿Pero qué parámetros?
:keyboard
:es un Símbolo, que es el equivalente de Ruby a un cadena interna.
adaptor: :keyboard
es un Picadillo.
Ruby tiene dos sintaxis hash principales:
{key => value}
Dónde key
y value
son cualquier objeto, o:
{key: value}
Dónde key
es un simple símbolo literal y value
es cualquier objeto.Además, para mantener el código limpio, cuando pasas un Hash como último parámetro a un método, puede omitir el {
y }
porque es inequívoco.Termina brindándole una llamada de método limpia de estilo "parámetro con nombre":
do_something_to my_person, kindness: 10, aggressiveness: 2
En tu código:
connection :keyboard, adaptor: :keyboard
Tiene la sintaxis hash alternativa (claves de símbolos) con la {
y }
Parado.Toda la línea es 100% equivalente a:
connection(:keyboard, {:adaptor => :keyboard})
Tu última línea:
device :keyboard, driver: :keyboard, connection: :keyboard
Es lo mismo.Equivalente a:
device(:keyboard, {:driver => :keyboard, :connection => :keyboard})
Simplemente se ve mejor (una vez que te acostumbras).
Otros consejos
En su ejemplo, connection
y device
son métodos.El código adapter: :keyboard
, driver: :keyboard
y :connection: :keyboard
bits son parámetros que se pasan como un hash a esos métodos.Los primeros parámetros pasados a la conexión () y el dispositivo () no se pasan en un hash.
El mismo código podría reescribirse así:
connection :keyboard, { adaptor => :keyboard }
device :keyboard, { driver => :keyboard, connection => :keyboard }