OpenComputers/Component API

Материал из Minecraft Wiki
Перейти к: навигация, поиск

Этот интерфейс используется для доступа и взаимодействия компьютера с компонентами.

Интерфейс[править | править код]

  • component.doc(address:string, method:string): string

Возвращает строку документации по заданному методу заданного адресом компонента. Обратите внимание, что вы также можете получить эту строку при помощи функции tostring. Пример: tostring(component.screen.isOn).


  • component.invoke(address:string, method:string[, ...]): ...

Вызывает заданный метод заданного адресом компонента. Необязательные аргументы функции посылаются как аргументы заданному методу. Возвращает результат вызова метода, например, значения возвращаемые им.


  • component.list([filter:string]):function

Возвращает итерируемый список всех компонентов присоединенных к компьютеру (сети) в виде кортежей «адрес, тип компонента».

Пример использования: for address, componentType in component.list() do ... end.

Если установлен параметр filter, функция возвращает только те компоненты, которые содержат заданную строку (это не шаблон/регулярное выражение). Например, component.list("red") вернет компоненты redstone.


  • component.proxy(address:string):table

Возвращает «прокси» объект компонента. Прокси предоставляет все методы компонента в качестве своих полей, что позволяет обращаться к ним напрямую (без вызова invoke).

Может использоваться для получения первого компонента некоторого типа:

component.proxy(component.list("redstone")()).getInput(sides.north)

Результат — прокси первого redstone компонента возвращенного оператором component.list вызывает метод getInput.

Примечание: component.listвсегда содержит как минимум два поля: type с названием типа компонента и address с его адресом.


  • component.type(address:string):string

Возвращает тип компонента заданного адресом.


  • component.get(address: string[, componentType: string]): string | (nil, string)

Пытается найти полный адрес компонента по сокращенному. Возвращает адрес в случае успеха, или nil и текст ошибки в противном случае. Необязательный параметр — фильтр по типу компонентов.


  • component.isAvailable(componentType: string): boolean

Проверяет доступен ли главный компонент с указанным типом.


  • component.getPrimary(componentType: string): table

Возвращает прокси главного компонента заданного типа. Вызывает ошибку, если такого не существует.


  • component.setPrimary(componentType: string, address: string)

Назначает новый главный компонент заданного типа. Адрес может быть сокращенным, но при этом должен быть правильным (если он не равен nil). Переключает сигналы component_unavailable или component_available если адрес равен nil или новому значению соответственно.


Примеры[править | править код]

Программа пишет «redstone» для каждой красной платы в сети.

local component = require("component")
-- prints `redstone` for each attached redstone card.
for _, name in component.list("red") do print(name) end


Обратите внимание, что Component API позволяет также следующий синтаксис:

local component = require("component")
local rs0 = component.getPrimary("redstone")
local rs1 = component.redstone -- syntactic sugar
print(rs0 == rs1) -- true


Адреса компонентов[править | править код]

Каждый компонент имеет свой адрес. Этот адрес представляет собой UUID — уникальный идентификатор. В большинстве случаев адрес можно сократить до уникальной части. Чтобы получить полный адрес из сокращенного используйте component.get. Чтобы узнать адрес конкретного устройства вы можете воспользоваться анализатором (зажмите Ctrl и щелкните правой кнопкой мыши).

Получение списка адресов всех компонентов в сети:

# lua
Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio
lua> local component = require("component")
lua> for k,v in component.list() do print(k, v) end
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    keyboard
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    screen
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    gpu
...

Обратите внимание, что компоненты сохраняют свои адреса даже тогда, когда удалены из компьютера. Таким образом, дисковод, который вы вытащили и поставили обратно, сохраняет свой адрес. Это не касается механизмов-блоков. Блоки получают новый адрес каждый раз, когда их ставят.


«Главный» компонент[править | править код]

Component API назначает один из компонентов каждого типа «главным». Если блоков одного типа несколько, «главный» выбирается случайно. Вы можете обращаться к главному компоненту оператором component.xxx, где xxx — это тип.

Например:

lua> component.gpu.address
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

В качестве альтернативы, вы можете воспользоваться оператором component.getPrimary("xxx"). В этом случае можно получить ошибку если не существует главного компонента этого типа. Это можно предварительно проверить оператором component.isAvailable("xxx"). Получить сообщение об ошибке может быть понятнее, чем nil в первом варианте.


Главный компонент используется, когда компьютер определяет на какой монитор выводить изображение при первом запуске.


Прокси[править | править код]

Есть два способа использования адресов компонентов. Первый — component.invoke(address, method, ...). Например:

local component = require("component")
component.invoke(modemAddress, "broadcast", port, data)

Более удобный способ — прокси. Прокси — это таблица, которая предоставляет одноимённую функцию для каждого вызова метода через invoke. Кроме того прокси имеет два поля: address, которое определяет адрес компонента, и type, которое содержит его тип. пример использования прокси:

local component = require("component")
local proxy = component.proxy(address)

-- The call above using the proxy:
proxy.broadcast(port, data)

-- The common proxy fields:
print(proxy.address) -- address passed to component.proxy above
print(proxy.type) -- "modem"

Примечание: когда вы обращаетесь к главному компоненту через component.getPrimary или component.xxx — вы используете его прокси.


Прямые вызовы[править | править код]

Некоторые вызовы компонентов могут выполняться как «прямые вызовы». «Прямые вызовы» выполняются в рабочем потоке компьютера. Это означает, что результат будет получен немедленно. Обычные вызовы делегируются в главный поток сервера, чтобы избежать состояния гонки и других конфликтов потоков. Это означает, что обычные вызовы выполняются в течение одного «такта» (50 миллисекунд).

Этот случай относится только к Component API.


Сигналы[править | править код]

Сигналы — важный элемент взаимодействия с компонентами. При помощи сигналов компоненты могут уведомлять компьютер о каких-либо событиях или изменениях вокруг. К примеру, пользовательский ввод обрабатывается компьютером при помощи сигналов. Компьютеры также могут создавать свои собственные сигналы. Это может быть удобно для повторного использования кода, или просто асинхронного доступа к другим частям кода.