Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
component:component_access:zh [2022/10/21 16:42]
pointtttt
component:component_access:zh [2023/11/29 08:29]
hfsr [信号]
Line 1: Line 1:
 访问组件 访问组件
 ======== ========
-本页描述了如何通过 Lua 调用[[:​component:​zh|组件 API]]。简单来说,组件是一些方块或物品提供的 API,供与之相连的计算机上的Lua程序调用。+本页描述了如何通过Lua访问[[:​component:​zh|组件 API]]。简单来说,组件是一些方块或物品,它们提供了一些API,供与之相连的电脑上的Lua程序调用。
  
 地址 地址
 ---- ----
-每个组件都有一个地址。这个地址是一个UUID,即唯一标识符。大多数情况下都可以简写这些地址。例如,要从一个缩写的地址中获得完整的地址,你可以使用 `component.get`。要得到任何方块的地址,你可以手持[[item:​analyzer:​zh|分析仪]]按住Ctrl右击方块。+每个组件都有一个地址。这个地址是一个UUID,即唯一标识符。大多数情况下都可以简写这些地址。要从一个缩写的地址中获得完整的地址,你可以用`component.get`。你可以手持[[item:​analyzer:​zh|分析仪]]按住ctrl右击方块以得到任意方块的地址
  
 要获得所有连接到你计算机的组件列表,你可以这样做: 要获得所有连接到你计算机的组件列表,你可以这样做:
Line 18: Line 18:
 ``` ```
  
-注意,即使从计算机上拆下来,物品组件的地址通常也不会改变。因此,如果你移除一个硬盘再将其重新插入,它的地址与之前的相同。而方块组件则*不是*这样,它们在被拆除再重新放置总是会得到一个新地址。+注意,即使从计算机上拆下来,物品组件的地址通常也不会改变。因此,如果你移除一个硬盘再将其重新插入,它的地址与之前的相同。而方块组件则**不是**这样,拆除它们再重新安装它们一定会得到一个新地址。
  
 你可以选择像这样过滤组件列表: 你可以选择像这样过滤组件列表:
  
-这段代码会将每一个名称中包含 "​adar"​ 的组件添加到表 radars 中,如 computronics 的雷达(computronicsRadar)或曲率驱动的雷达(warpdriveRadar)。+这段代码会将每一个名称中包含 "​adar"​ 的组件添加到表radars中,如computronics的雷达(computronicsRadar)或warpDrive(曲率驱动的雷达(warpdriveRadar)。
 ```lua ```lua
 local component = require("​component"​) local component = require("​component"​)
Line 40: Line 40:
 ``` ```
  
-组件+首选组件
 ------ ------
-[[api:​component:​zh|组件 API]] 每种类型选择一个组件作为"​主"​组件进行跟踪。如果有多个相同类型组件,一个被选组件是随机的。你可以通过 `component.xxx` 访问特定类型的组件,其中 `xxx` 是类型,比如:+[[api:​component:​zh|component(组件API]]会持续追踪每种组件类型的“首组件。如果同一种类型下有多个组件,则会随机选择一个首选组件。你可以通过`component.xxx`访问特定类型的首选组件,其中`xxx`是类型,比如:
 ```lua ```lua
 lua> =component.gpu.address lua> =component.gpu.address
Line 48: Line 48:
 ``` ```
  
-或者你也可以使用 `component.getPrimary("​xxx"​)` 。切记,如果指定类型的组件不存在,调用引起一个错误,你可能会希望先用 `component.isAvailable("​xxx"​)` 进行检查。之所以选择直接引发错误而不是返回 nil,是因为相较于在后续代码中试图访问 nil 中的元素而产生错误,直接在这里抛出一个错误更能明确问题来源。+或者你也可以使用`component.getPrimary("​xxx"​)`。切记,如果指定类型的首选组件不存在,调用此方法抛出一个错误,因此最好先用`component.isAvailable("​xxx"​)`进行检查。之所以选择直接抛出错误而不是返回`nil`,是因为相较于在后续代码中试图访问`nil`中的元素而产生错误,直接在这里抛出一个错误更能明确问题来源。
  
-这个系统主要是为了让操作系统选择输出屏幕。+这个系统主要是为了让操作系统选择初输出屏幕。
  
-代理+代理对象
 ---- ----
-现在我们知道了如何获得组件地址,现在让我们看看如何与它们互。有两种方法可以做到这一点。一种是调用 `component.invoke(address,​ method, ...)` 。例如:+现在我们已经知道了如何获得组件地址,那么看看如何与它们。有两种方法可以做到这一点。一种是调用`component.invoke(address,​ method, ...)`。例如:
 ```lua ```lua
 local component = require("​component"​) local component = require("​component"​)
Line 60: Line 60:
 ``` ```
  
-而更的方法通常是获取一个代理。代理是一个简单的 ​table,为个 API 回调提供一个函数,以该回调命名。此外,每个代理有两个字段:`address` 用来保存被包装的组件的地址`type` 用来保存组件的类型。你可以这获得一个代理:+通常言,的方法是获取一个代理对象。代理对象是一个简单的,为个API回调提供同名的的函数。此外,每个代理有两个字段:`address`用来保存被包装的组件的地址`type`用来保存组件的类型。你可以通过种方法获得代理对象
 ```lua ```lua
 local component = require("​component"​) local component = require("​component"​)
 local proxy = component.proxy(address) local proxy = component.proxy(address)
  
--- 下面的调用是通过代理进行的+-- 上文调用的使用代理对象版本
 proxy.broadcast(port,​ data) proxy.broadcast(port,​ data)
  
--- 常见的代理字段: +-- 常见的代理对象字段: 
-print(proxy.address) -- 传给上述 component.proxy 的地址+print(proxy.address) -- 传给上述component.proxy的地址
 print(proxy.type) -- "​modem"​ print(proxy.type) -- "​modem"​
 ``` ```
  
-通过 `component.getPrimary` 或 `component.xxx` 访问的所有主组件实际上都是一个代理。+请注意,通过`component.getPrimary`或`component.xxx`访问的首选组件实际上都是代理对象
  
 直接调用 直接调用
 -------- --------
-一些组件的回调可以作为"​直接调用"​执行。直接调用是在计算机的工作线程中进行的,这意味着它们会立即返回。普通调用会被委托给主服务线程,以避免竞争条件和其他线程问题,这也意味着普通调用多需要一个 tick(即50ms)。这里明确一下:只有组件 API 会有这种情况。+一些组件的回调可以"​直接调用"​的形式执行。直接调用是在计算机的工作线程中进行的,这意味着它们会立即返回。普通调用会被委托给主服务线程,以避免出现态问题或其他线程问题,这也意味着普通调用需要一tick(即50ms)才能完成。这里明确一下:只有component(组件API会有这种情况。
  
 信号 信号
 ---- ----
-与组件交互的一个重要部分是[[:​component:​signals:​zh|信号]] 。这些信号可以被组件推入队列,以通知计算机外部变化和事件。例如,用户的输入就是通过信号转发给计算机的。计算机也可以排队等待他们自己的信号,这有助于代码复用,或者只是异步通知你代码的其他部分。+[[:​component:​signals:​zh|信号]]是于组件交互时很重要的一部分。信号可以被组件推入队列,以通知电脑外部变化和事件。例如,用户的输入就是通过信号转发给电脑的。电脑也可以自己的信号加入队列,这有助于代码复用,或者只是异步通知你代码的其他部分。
  
 目录 目录