Сокращения в Ruby, Artoo.io
Я ищу объяснение того, что происходит на вершине роботов artoo.io. Вверху этого примера есть объявление с использованием драйвера клавиатуры:
require 'artoo'
connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard
Кажется, что отображается некоторый сокращенный / альтернативный синтаксис, и я хотел бы объяснить это сокращение. Я понимаю альтернативный синтаксис хэша: :adapter => :keyboard
,
Что происходит в этих последних двух строках кода выше? Что такое connection
? Это класс внутри artoo
что инициализируется? Почему нет new
? Где же :keyboard
родом из? Если есть альтернативный синтаксис, который представляет отношения более явно, не могли бы вы показать это?
2 ответа
Это большой вопрос. Это может быть дубликат, но я не смог найти его, и это довольно сложно для умных программистов, которые плохо знакомы с Ruby.
Во-первых, на ваш вопрос: что такое connection
?
Это вызов метода. В некоторых случаях бывает сложно сказать, что такое метод и что такое переменная, потому что это зависит только от того, как они были определены. Но в этом случае это понятно, потому что connection
имеет параметры после него. В ruby метод может быть вызван так:
foo
В этом случае это метод, который не принимает параметров. Или это может выглядеть так:
foo 1, 2, 3
Это метод с тремя параметрами. Или это может выглядеть так:
foo(1, 2, 3)
Это тот же метод, но с немного другим синтаксисом (который более знаком людям в таких языках c-mimicing, как c, C++, Java, Javascript, C# и т. Д.)
Поэтому, когда вы видите параметры, перечисленные после простого слова, без операторов между ними, это верный признак того, что это вызов метода.
Теперь разбить ваш код полностью.
require 'artoo'
Технически это вызов метода. Вы звоните require
метод и передача одного параметра буквальной строки 'artoo'
, Как вы, наверное, знаете, require
загружает внешний файл ruby в текущий файл.
connection :keyboard, adaptor: :keyboard
Это вызов метода с некоторым синтаксическим сахаром:
Вы сразу знаете, что connection
это вызов метода, потому что он имеет параметры после него (то есть нет оператора между connection
и что будет после). Но какие параметры?
:keyboard
: является символом, который является эквивалентом строки ruby.
adaptor: :keyboard
это хеш
В Ruby есть два основных синтаксиса хэша:
{key => value}
куда key
а также value
любые объекты, или:
{key: value}
куда key
голый буквальный символ и value
это любой объект. Кроме того, для поддержания чистоты кода, когда вы передаете Hash в качестве последнего параметра методу, вы можете не указывать {
а также }
потому что это однозначно. В итоге вы получите чистый вызов метода в стиле "именованный параметр":
do_something_to my_person, kindness: 10, aggressiveness: 2
В вашем коде:
connection :keyboard, adaptor: :keyboard
У вас есть альтернативный синтаксис хеша (символьные ключи) с {
а также }
остановился Вся строка на 100% эквивалентна:
connection(:keyboard, {:adaptor => :keyboard})
Ваша последняя строка:
device :keyboard, driver: :keyboard, connection: :keyboard
Это то же самое. Эквивалентно:
device(:keyboard, {:driver => :keyboard, :connection => :keyboard})
Это просто выглядит лучше (как только вы к этому привыкнете).
В вашем примере connection
а также device
методы. adapter: :keyboard
, driver: :keyboard
а также :connection: :keyboard
биты - это параметры, передаваемые в качестве хэша этим методам. Первые параметры, переданные в connection() и device(), не передаются в хеш.
Тот же код можно переписать так:
connection :keyboard, { adaptor => :keyboard }
device :keyboard, { driver => :keyboard, connection => :keyboard }