Minecraft Wiki
Нет описания правки
(Небольшая правка смысла)
Метка: Визуальный редактор
 
(не показаны 3 промежуточные версии 3 участников)
Строка 2: Строка 2:
   
 
== Интерфейс ==
 
== Интерфейс ==
 
* <code>component.doc(address:string, method:string): string</code>
 
*<code>component.doc(address:string, method:string): string</code>
 
 
Возвращает строку документации по заданному методу заданного адресом компонента.
 
Возвращает строку документации по заданному методу заданного адресом компонента.
 
Обратите внимание, что вы также можете получить эту строку при помощи функции <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>).
+
Возвращает «прокси» объект компонента. Прокси предоставляет все методы компонента в качестве своих полей, что позволяет обращаться к ним напрямую (без вызова <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>redstone</code> компонента возвращенного оператором <code>component.list</code> вызывает метод <code>getInput</code>.
   
''Примечание'': прокси всегда содержит как минимум два поля: <code>type</code> с названием типа компонента и <code>address</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/Красная плата|красной платы]] в сети.
+
Программа пишет «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:
   
   
Обратите внимание, что [[OpenComputers/Component API|Component API]] позволяет также следующий синтаксис:
+
Обратите внимание, что 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 - уникальный идентификатор. В большинстве случаев адрес можно сократить до уникальной части. Чтобы получить полный адрес из сокращенного используйте <code>component.get</code>. Чтобы узнать адрес конкретного устройства вы можете воспользоваться [[OpenComputers/Анализатор|анализатором]] (зажмите {{Кнопка|Ctrl}} и щелкните правой кнопкой мыши).
+
Каждый компонент имеет свой адрес. Этот адрес представляет собой UUID — уникальный идентификатор. В большинстве случаев адрес можно сократить до уникальной части. Чтобы получить полный адрес из сокращенного используйте <code>component.get</code>. Чтобы узнать адрес конкретного устройства вы можете воспользоваться [[OpenComputers/Анализатор|анализатором]] (зажмите {{Кнопка|Ctrl}} и щелкните правой кнопкой мыши).
   
 
Получение списка адресов всех компонентов в сети:
 
Получение списка адресов всех компонентов в сети:
Строка 82: Строка 81:
   
   
== "Главный" компонент ==
+
== «Главный» компонент ==
[[OpenComputers/Component API|Component API]] назначает один из компонентов каждого типа "главным". Если блоков одного типа несколько, "главный" выбирается случайно. Вы можете обращаться к главному компоненту оператором <code>component.xxx</code>, где <code>xxx</code> - это тип.
+
Component API назначает один из компонентов каждого типа «главным». Если блоков одного типа несколько, «главный» выбирается случайно. Вы можете обращаться к главному компоненту оператором <code>component.xxx</code>, где <code>xxx</code> — это тип.
   
 
Например:
 
Например:
Строка 96: Строка 95:
   
 
== Прокси ==
 
== Прокси ==
Есть два способа использования адресов компонентов. Первый - <code>component.invoke(address, method, ...)</code>. Например:
+
Есть два способа использования адресов компонентов. Первый — <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>, которое содержит его тип. пример использования прокси:
+
Более удобный способ — прокси. Прокси — это таблица, которая предоставляет одноимённую функцию для каждого вызова метода через <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 миллисекунд).
+
Некоторые вызовы компонентов могут выполняться как «прямые вызовы». «Прямые вызовы» выполняются в рабочем потоке компьютера. Это означает, что результат будет получен немедленно. Обычные вызовы делегируются в главный поток сервера, чтобы избежать состояния гонки и других конфликтов потоков. Это означает, что обычные вызовы выполняются в течение одного «такта» (50 миллисекунд).
   
Этот случай относится только к [[OpenComputers/Component API|Component API]].
+
Этот случай относится только к 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.


Сигналы

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