Anonymous 6222778120ee77.02453280 (обс. | вклад) Нет описания правки |
(Небольшая правка смысла) Метка: Визуальный редактор |
||
(не показаны 3 промежуточные версии 3 участников) | |||
Строка 2: | Строка 2: | ||
== Интерфейс == |
== Интерфейс == |
||
⚫ | |||
− | |||
⚫ | |||
Возвращает строку документации по заданному методу заданного адресом компонента. |
Возвращает строку документации по заданному методу заданного адресом компонента. |
||
Обратите внимание, что вы также можете получить эту строку при помощи функции <code>tostring</code>. Пример: <code>tostring(component.screen.isOn)</code>. |
Обратите внимание, что вы также можете получить эту строку при помощи функции <code>tostring</code>. Пример: <code>tostring(component.screen.isOn)</code>. |
||
− | *<code>component.invoke(address:string, method:string[, ...]): ...</code> |
+ | * <code>component.invoke(address:string, method:string[, ...]): ...</code> |
Вызывает заданный метод заданного адресом компонента. Необязательные аргументы функции посылаются как аргументы заданному методу. Возвращает результат вызова метода, например, значения возвращаемые им. |
Вызывает заданный метод заданного адресом компонента. Необязательные аргументы функции посылаются как аргументы заданному методу. Возвращает результат вызова метода, например, значения возвращаемые им. |
||
− | *<code>component.list([filter:string]):function</code> |
+ | * <code>component.list([filter:string]):function</code> |
− | Возвращает итерируемый список всех компонентов присоединенных к компьютеру (сети) в виде кортежей |
+ | Возвращает итерируемый список всех компонентов присоединенных к компьютеру (сети) в виде кортежей «адрес, тип компонента». |
Пример использования: <code>for address, componentType in component.list() do ... end</code>. |
Пример использования: <code>for address, componentType in component.list() do ... end</code>. |
||
Строка 20: | Строка 19: | ||
− | *<code>component.proxy(address:string):table</code> |
+ | * <code>component.proxy(address:string):table</code> |
− | Возвращает |
+ | Возвращает «прокси» объект компонента. Прокси предоставляет все методы компонента в качестве своих полей, что позволяет обращаться к ним напрямую (без вызова <code>invoke</code>). |
Может использоваться для получения первого компонента некоторого типа: |
Может использоваться для получения первого компонента некоторого типа: |
||
Строка 27: | Строка 26: | ||
<code>component.proxy(component.list("redstone")()).getInput(sides.north)</code> |
<code>component.proxy(component.list("redstone")()).getInput(sides.north)</code> |
||
− | Результат |
+ | Результат — прокси первого <code>redstone</code> компонента возвращенного оператором <code>component.list</code> вызывает метод <code>getInput</code>. |
− | ''Примечание'': |
+ | ''Примечание'': <code>component.list</code>всегда содержит как минимум два поля: <code>type</code> с названием типа компонента и <code>address</code> с его адресом. |
− | *<code>component.type(address:string):string</code> |
+ | * <code>component.type(address:string):string</code> |
Возвращает тип компонента заданного адресом. |
Возвращает тип компонента заданного адресом. |
||
− | *<code>component.get(address: string[, componentType: string]): string | (nil, string)</code> |
+ | * <code>component.get(address: string[, componentType: string]): string | (nil, string)</code> |
− | Пытается найти полный адрес компонента по сокращенному. Возвращает адрес в случае успеха, или <code>nil</code> и текст ошибки в противном случае. Необязательный параметр |
+ | Пытается найти полный адрес компонента по сокращенному. Возвращает адрес в случае успеха, или <code>nil</code> и текст ошибки в противном случае. Необязательный параметр — фильтр по типу компонентов. |
− | *<code>component.isAvailable(componentType: string): boolean</code> |
+ | * <code>component.isAvailable(componentType: string): boolean</code> |
Проверяет доступен ли главный компонент с указанным типом. |
Проверяет доступен ли главный компонент с указанным типом. |
||
− | *<code>component.getPrimary(componentType: string): table</code> |
+ | * <code>component.getPrimary(componentType: string): table</code> |
Возвращает прокси главного компонента заданного типа. Вызывает ошибку, если такого не существует. |
Возвращает прокси главного компонента заданного типа. Вызывает ошибку, если такого не существует. |
||
− | *<code>component.setPrimary(componentType: string, address: string)</code> |
+ | * <code>component.setPrimary(componentType: string, address: string)</code> |
Назначает новый главный компонент заданного типа. Адрес может быть сокращенным, но при этом должен быть правильным (если он не равен <code>nil</code>). Переключает сигналы <code>component_unavailable</code> или <code>component_available</code> если адрес равен <code>nil</code> или новому значению соответственно. |
Назначает новый главный компонент заданного типа. Адрес может быть сокращенным, но при этом должен быть правильным (если он не равен <code>nil</code>). Переключает сигналы <code>component_unavailable</code> или <code>component_available</code> если адрес равен <code>nil</code> или новому значению соответственно. |
||
== Примеры == |
== Примеры == |
||
− | Программа пишет |
+ | Программа пишет «redstone» для каждой [[OpenComputers/Красная плата|красной платы]] в сети. |
<pre>local component = require("component") |
<pre>local component = require("component") |
||
-- prints `redstone` for each attached redstone card. |
-- prints `redstone` for each attached redstone card. |
||
Строка 59: | Строка 58: | ||
− | Обратите внимание, что |
+ | Обратите внимание, что Component API позволяет также следующий синтаксис: |
<pre>local component = require("component") |
<pre>local component = require("component") |
||
local rs0 = component.getPrimary("redstone") |
local rs0 = component.getPrimary("redstone") |
||
Строка 67: | Строка 66: | ||
== Адреса компонентов == |
== Адреса компонентов == |
||
− | Каждый компонент имеет свой адрес. Этот адрес представляет собой UUID |
+ | Каждый компонент имеет свой адрес. Этот адрес представляет собой UUID — уникальный идентификатор. В большинстве случаев адрес можно сократить до уникальной части. Чтобы получить полный адрес из сокращенного используйте <code>component.get</code>. Чтобы узнать адрес конкретного устройства вы можете воспользоваться [[OpenComputers/Анализатор|анализатором]] (зажмите {{Кнопка|Ctrl}} и щелкните правой кнопкой мыши). |
Получение списка адресов всех компонентов в сети: |
Получение списка адресов всех компонентов в сети: |
||
Строка 82: | Строка 81: | ||
− | == |
+ | == «Главный» компонент == |
− | + | Component API назначает один из компонентов каждого типа «главным». Если блоков одного типа несколько, «главный» выбирается случайно. Вы можете обращаться к главному компоненту оператором <code>component.xxx</code>, где <code>xxx</code> — это тип. |
|
Например: |
Например: |
||
Строка 96: | Строка 95: | ||
== Прокси == |
== Прокси == |
||
− | Есть два способа использования адресов компонентов. Первый |
+ | Есть два способа использования адресов компонентов. Первый — <code>component.invoke(address, method, ...)</code>. Например: |
<pre>local component = require("component") |
<pre>local component = require("component") |
||
component.invoke(modemAddress, "broadcast", port, data)</pre> |
component.invoke(modemAddress, "broadcast", port, data)</pre> |
||
− | Более удобный способ |
+ | Более удобный способ — прокси. Прокси — это таблица, которая предоставляет одноимённую функцию для каждого вызова метода через <code>invoke</code>. Кроме того прокси имеет два поля: <code>address</code>, которое определяет адрес компонента, и <code>type</code>, которое содержит его тип. пример использования прокси: |
<pre>local component = require("component") |
<pre>local component = require("component") |
||
local proxy = component.proxy(address) |
local proxy = component.proxy(address) |
||
Строка 111: | Строка 110: | ||
print(proxy.type) -- "modem"</pre> |
print(proxy.type) -- "modem"</pre> |
||
− | ''Примечание'': когда вы обращаетесь к главному компоненту через <code>component.getPrimary</code> или <code>component.xxx</code> |
+ | ''Примечание'': когда вы обращаетесь к главному компоненту через <code>component.getPrimary</code> или <code>component.xxx</code> — вы используете его прокси. |
== Прямые вызовы == |
== Прямые вызовы == |
||
− | Некоторые вызовы компонентов могут выполняться как |
+ | Некоторые вызовы компонентов могут выполняться как «прямые вызовы». «Прямые вызовы» выполняются в рабочем потоке компьютера. Это означает, что результат будет получен немедленно. Обычные вызовы делегируются в главный поток сервера, чтобы избежать состояния гонки и других конфликтов потоков. Это означает, что обычные вызовы выполняются в течение одного «такта» (50 миллисекунд). |
− | Этот случай относится только к |
+ | Этот случай относится только к Component API. |
== Сигналы == |
== Сигналы == |
||
− | [[OpenComputers/Сигналы|Сигналы]] |
+ | [[OpenComputers/Сигналы|Сигналы]] — важный элемент взаимодействия с компонентами. При помощи сигналов компоненты могут уведомлять компьютер о каких-либо событиях или изменениях вокруг. К примеру, пользовательский ввод обрабатывается компьютером при помощи сигналов. Компьютеры также могут создавать свои собственные сигналы. Это может быть удобно для повторного использования кода, или просто асинхронного доступа к другим частям кода. |
Текущая версия от 15:07, 26 сентября 2019
Этот интерфейс используется для доступа и взаимодействия компьютера с компонентами.
Интерфейс
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.
Сигналы
Сигналы — важный элемент взаимодействия с компонентами. При помощи сигналов компоненты могут уведомлять компьютер о каких-либо событиях или изменениях вокруг. К примеру, пользовательский ввод обрабатывается компьютером при помощи сигналов. Компьютеры также могут создавать свои собственные сигналы. Это может быть удобно для повторного использования кода, или просто асинхронного доступа к другим частям кода.