Сокращение на Ruby, Artoo.io
Вопрос
Я ищу объяснение тому, что происходит в верхней части artoo.io роботы.В верхней части этого примера есть объявление, использующее драйвер клавиатуры:
require 'artoo'
connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard
Кажется, что отображается какой-то сокращенный / альтернативный синтаксис, и я хотел бы получить объяснение этого сокращения.Я понимаю альтернативный синтаксис хэша: :adapter => :keyboard
.
Что происходит в этих последних двух строках кода выше?Что такое connection
?Это класс внутри artoo
это инициализируется?Почему здесь нет new
?Где находится :keyboard
откуда взялся?Если есть альтернативный синтаксис, который представляет отношения более явно, не могли бы вы показать и это?
Решение
Это отличный вопрос.Возможно, это дубликат, но я не смог его найти, а это как раз то, что сложно сделать умным программистам, новичкам в Ruby.
Во-первых, к вашему вопросу:Что такое connection
?
Это вызов метода.В некоторых случаях может быть трудно определить, что такое метод, а что - переменная, потому что это просто зависит от того, как они были определены.Но в данном случае это понятно, потому что connection
имеет параметры после него.В ruby метод может быть вызван следующим образом:
foo
В таком случае это метод, который не принимает параметров.Или это может выглядеть примерно так:
foo 1, 2, 3
Это метод с тремя параметрами.Или это может выглядеть примерно так:
foo(1, 2, 3)
Это тот же метод, но с немного другим синтаксисом (который более знаком людям, работающим на языках, имитирующих c, таких как 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
является любым объектом.Кроме того, чтобы сохранить код чистым, когда вы передаете хэш в качестве Последние параметр для метода, вы можете оставить без внимания {
и }
потому что это недвусмысленно.В конечном итоге это приводит к чистому вызову метода в стиле "именованный параметр":
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
являются параметрами, передаваемыми в качестве хеша к этим методам.Первые параметры, переданные для подключения () и устройства (), не передаются в хэш.
Один и тот же код может быть переписан так:
connection :keyboard, { adaptor => :keyboard }
device :keyboard, { driver => :keyboard, connection => :keyboard }
.