De forma abreviada em Ruby, Artoo.io
Pergunta
Eu estou procurando uma explicação para o que está acontecendo no topo da artoo.io robôs.Há uma declaração na parte superior deste exemplo usando o driver de teclado:
require 'artoo'
connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard
Parece que alguns abreviada/sintaxe alternativa é apresentada, e gostaria de uma explicação de que forma abreviada.Eu entendo a alternativa hash sintaxe: :adapter => :keyboard
.
O que está acontecendo nessas duas últimas linhas de código acima?O que é connection
?É uma classe dentro artoo
que está sendo inicializado?Por que não há new
?Onde é que :keyboard
vem?Se há uma sintaxe alternativa que representa as relações de forma mais explícita, pode mostrar que o bem?
Solução
Esta é uma grande questão.Ele pode ser duplicado, mas eu não conseguia encontrar um e este é o tipo de coisa que é complicado para smart programadores que são novos para o Ruby.
Primeiro, à sua pergunta:O que é connection
?
É um chamada de método.Em alguns casos, pode ser difícil dizer o que é um método e o que é uma variável, porque isso só depende de como elas foram definidas.Mas, neste caso, é claro, porque connection
tem parâmetros após ele.No ruby, um método pode ser chamado assim:
foo
Neste caso, é um método que leva sem parâmetros.Ou ele pode ter esta aparência:
foo 1, 2, 3
Que é um método com três parâmetros.Ou ele pode ter esta aparência:
foo(1, 2, 3)
Que é o mesmo método, mas com uma sintaxe ligeiramente diferente (o que é mais familiar para as pessoas experiências em c-mimicing linguagens como c, C++, Java, Javascript, C#, etc...)
Então, quando você vê os parâmetros listados após uma simples palavra, sem operadores entre, é um sinal certo de que é uma chamada de método.
Agora, para quebrar seu código completo.
require 'artoo'
Este é, tecnicamente, uma chamada de método.O que você está chamando o require
método e passar um único parâmetro de seqüência de caracteres literal 'artoo'
.Como você provavelmente sabe, require
cargas externas ruby ficheiro para o ficheiro actual.
connection :keyboard, adaptor: :keyboard
Esta é uma chamada de método com alguns um açúcar sintático:
Você sabe imediatamente que connection
é uma chamada de método, porque tem os parâmetros a seguir (i.e.nenhum operador entre connection
e o que vem depois).Mas que parâmetros?
:keyboard
:é um Símbolo, o que é ruby equivalente a de um estagiário gostaria de seqüência de caracteres.
adaptor: :keyboard
é um Hash.
O Ruby tem dois principais hash sintaxes:
{key => value}
Onde key
e value
são objetos, ou:
{key: value}
Onde key
é um simples Símbolo literal e value
é qualquer objeto.Além disso, para manter o código limpo, quando você passar um Hash como o última parâmetro para um método, você pode deixar de fora o {
e }
porque é inequívoca.Ele acaba lhe dando um limpa "chamado" parâmetro de estilo chamada de método:
do_something_to my_person, kindness: 10, aggressiveness: 2
No seu código:
connection :keyboard, adaptor: :keyboard
Você tem a alternativa de hash sintaxe (símbolo chaves) com o {
e }
parou.Toda a linha é 100% equivalente a:
connection(:keyboard, {:adaptor => :keyboard})
Sua última linha:
device :keyboard, driver: :keyboard, connection: :keyboard
É a mesma coisa.Equivalente a:
device(:keyboard, {:driver => :keyboard, :connection => :keyboard})
Ele só parece melhor (uma vez que você se acostumar a ele).
Outras dicas
No seu exemplo, connection
e device
são métodos.O adapter: :keyboard
, driver: :keyboard
e :connection: :keyboard
bits são parâmetros passados como um hash para esses métodos.A primeira parâmetros passados para conexão() e dispositivo() não estão sendo passados em um hash.
O mesmo código pode ser reescrita assim:
connection :keyboard, { adaptor => :keyboard }
device :keyboard, { driver => :keyboard, connection => :keyboard }