Kurzschrift in Rubin, Artoo.io
Frage
Ich suche nach einer Erklärung dafür, was oben vor sich geht artoo.io Roboter.Oben in diesem Beispiel befindet sich eine Deklaration mit dem Tastaturtreiber:
require 'artoo'
connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard
Es scheint, dass eine Kurzschrift / alternative Syntax angezeigt wird, und ich würde eine Erklärung dieser Kurzschrift lieben.Ich verstehe die alternative Hash-Syntax: :adapter => :keyboard
.
Was ist in den letzten beiden Codezeilen oben los?Was ist connection
?Ist es eine Klasse drinnen artoo
das wird initialisiert?Warum gibt es keine new
?Woher kommt :keyboard
woher kommen?Wenn es eine alternative Syntax gibt, die die Beziehungen expliziter darstellt, könnten Sie das auch zeigen?
Lösung
Das ist eine großartige Frage.Es könnte ein Duplikat sein, aber ich konnte keines finden, und das ist die Art von Dingen, die für kluge Programmierer, die neu in Ruby sind, schwierig sind.
Zuerst zu deiner Frage:Was ist connection
?
Es ist ein Methodenaufruf.In einigen Fällen kann es schwierig sein zu sagen, was eine Methode und was eine Variable ist, weil es nur davon abhängt, wie sie definiert wurden.Aber in diesem Fall ist es klar, weil connection
hat Parameter danach.In Ruby kann eine Methode wie folgt aufgerufen werden:
foo
In diesem Fall ist es eine Methode, die keine Parameter akzeptiert.Oder es kann so aussehen:
foo 1, 2, 3
Das ist eine Methode mit drei Parametern.Oder es kann so aussehen:
foo(1, 2, 3)
Das ist die gleiche Methode, aber mit einer etwas anderen Syntax (die den Menschen mit c-Nachahmungssprachen wie c, C ++, Java, Javascript, C # usw. vertrauter ist)...)
Wenn Sie also Parameter nach einem bloßen Wort ohne Operatoren dazwischen sehen, ist dies ein sicheres Zeichen dafür, dass es sich um einen Methodenaufruf handelt.
Jetzt brechen Sie Ihren Code vollständig auf.
require 'artoo'
Dies ist technisch ein Methodenaufruf.Du rufst die an require
methode und Übergabe eines einzelnen Parameters der Literalzeichenfolge 'artoo'
.Wie Sie wahrscheinlich wissen, require
lädt eine externe Ruby-Datei in die aktuelle Datei.
connection :keyboard, adaptor: :keyboard
Dies ist ein Methodenaufruf mit einigen syntaktischer Zucker:
Das weißt du sofort connection
ist ein Methodenaufruf, weil ihm Parameter nachgestellt sind (z.kein Operator zwischen connection
und was danach kommt).Aber welche Parameter?
:keyboard
:ist ein Symbol, was Rubys Äquivalent zu einem ist interner String.
adaptor: :keyboard
ist ein Hash.
Ruby hat zwei primäre Hash-Syntaxen:
{key => value}
Wo key
und value
sind irgendwelche Gegenstände, oder:
{key: value}
Wo key
ist ein bloßes wörtliches Symbol und value
ist ein beliebiges Objekt.Auch, um Code sauber zu halten, wenn Sie einen Hash als übergeben letzt parameter zu einer Methode, können Sie die weglassen {
und }
weil es eindeutig ist.Es endet damit, dass Sie einen sauberen Methodenaufruf im Stil eines "benannten Parameters" erhalten:
do_something_to my_person, kindness: 10, aggressiveness: 2
In deinem Code:
connection :keyboard, adaptor: :keyboard
Sie haben die alternative Hash-Syntax (Symbolschlüssel) mit dem {
und }
aufgeh.Die gesamte Linie entspricht zu 100%:
connection(:keyboard, {:adaptor => :keyboard})
Deine letzte Zeile:
device :keyboard, driver: :keyboard, connection: :keyboard
Ist das Gleiche.Äquivalent zu:
device(:keyboard, {:driver => :keyboard, :connection => :keyboard})
Es sieht einfach schöner aus (sobald man sich daran gewöhnt hat).
Andere Tipps
In Ihrem Beispiel, connection
und device
sind Methoden.Der adapter: :keyboard
, driver: :keyboard
und :connection: :keyboard
bits sind Parameter, die als Hash an diese Methoden übergeben werden.Die ersten an connection() und device() übergebenen Parameter werden nicht in einem Hash übergeben.
Der gleiche Code könnte so umgeschrieben werden:
connection :keyboard, { adaptor => :keyboard }
device :keyboard, { driver => :keyboard, connection => :keyboard }