<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ocr.michiyo.me/w/index.php?action=history&amp;feed=atom&amp;title=Component%2Fcomponent_access%2Fzh</id>
	<title>Component/component access/zh - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://ocr.michiyo.me/w/index.php?action=history&amp;feed=atom&amp;title=Component%2Fcomponent_access%2Fzh"/>
	<link rel="alternate" type="text/html" href="https://ocr.michiyo.me/w/index.php?title=Component/component_access/zh&amp;action=history"/>
	<updated>2026-08-24T15:34:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://ocr.michiyo.me/w/index.php?title=Component/component_access/zh&amp;diff=1139&amp;oldid=prev</id>
		<title>imported&gt;OCDoc Import: Imported from legacy OpenComputers documentation at ocdoc.cil.li</title>
		<link rel="alternate" type="text/html" href="https://ocr.michiyo.me/w/index.php?title=Component/component_access/zh&amp;diff=1139&amp;oldid=prev"/>
		<updated>2026-08-24T08:08:27Z</updated>

		<summary type="html">&lt;p&gt;Imported from legacy OpenComputers documentation at ocdoc.cil.li&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= 访问组件 =&lt;br /&gt;
&lt;br /&gt;
本页描述了如何通过Lua访问[[Component/zh|组件 API]]。简单来说，组件是一些方块或物品，它们提供了一些API，供与之相连的电脑上的Lua程序调用。&lt;br /&gt;
&lt;br /&gt;
== 地址 ==&lt;br /&gt;
&lt;br /&gt;
每个组件都有一个地址。这个地址是一个UUID，即唯一标识符。大多数情况下都可以简写这些地址。要从一个缩写的地址中获得完整的地址，你可以调用`component.get`。你还可以手持[[Item/analyzer/zh|分析仪]]按住ctrl右击方块以得到任意方块的地址。&lt;br /&gt;
&lt;br /&gt;
要获得所有连接到你计算机的组件列表，你可以这样做： ```lua Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio lua&amp;gt; local component = require(&amp;quot;component&amp;quot;) lua&amp;gt; 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 ... ```&lt;br /&gt;
&lt;br /&gt;
注意，即使从计算机上拆下来，物品组件的地址通常也不会改变。因此，如果你移除一个硬盘再将其重新插入，它的地址仍与之前的相同。而方块组件则&amp;#039;&amp;#039;&amp;#039;不是&amp;#039;&amp;#039;&amp;#039;这样，拆除它们再重新安装必然会改变地址。&lt;br /&gt;
&lt;br /&gt;
你可以选择像这样过滤组件列表：&lt;br /&gt;
&lt;br /&gt;
这段代码会将每一个名称中包含 &amp;quot;adar&amp;quot; 的组件添加到表radars中，如computronics的雷达（computronicsRadar）或warpDrive（曲率驱动）的雷达（warpdriveRadar）。 ```lua local component = require(&amp;quot;component&amp;quot;) local radars = {} for address, name in component.list(&amp;quot;adar&amp;quot;, false) do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;table.insert(radars, component.proxy(address))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
end ```&lt;br /&gt;
&lt;br /&gt;
这段代码只将所有连接的曲率驱动雷达（warpdriveRadar）添加到表 radars 中 ```lua local component = require(&amp;quot;component&amp;quot;) local radars = {} for address, name in component.list(&amp;quot;warpdriveRadar&amp;quot;, true) do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;table.insert(radars, component.proxy(address))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
end ```&lt;br /&gt;
&lt;br /&gt;
== 首选组件 ==&lt;br /&gt;
&lt;br /&gt;
[[API/component/zh|component(组件) API]]会持续追踪每种组件类型的“首选”组件。如果同一种类型下有多个组件，则会随机选择一个作为首选组件。你可以通过`component.xxx`访问特定类型的首选组件，其中`xxx`是类型，比如： ```lua lua&amp;gt; =component.gpu.address xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ```&lt;br /&gt;
&lt;br /&gt;
或者你也可以使用`component.getPrimary(&amp;quot;xxx&amp;quot;)`。切记，如果指定类型的首选组件不存在，调用此方法会抛出一个错误，因此最好先用`component.isAvailable(&amp;quot;xxx&amp;quot;)`进行检查。之所以选择直接抛出错误而不是返回`nil`，是因为相较于在后续代码中试图访问`nil`中的元素而产生错误，直接在这里抛出一个错误更能明确问题来源。&lt;br /&gt;
&lt;br /&gt;
这个系统主要是为了让操作系统选择初始输出屏幕。&lt;br /&gt;
&lt;br /&gt;
== 代理对象 ==&lt;br /&gt;
&lt;br /&gt;
现在我们已经知道了如何获得组件地址，那么看看如何与它们交互吧。有两种方法可以做到这一点。一种是调用`component.invoke(address, method, ...)`。例如： ```lua local component = require(&amp;quot;component&amp;quot;) component.invoke(modemAddress, &amp;quot;broadcast&amp;quot;, port, data) ```&lt;br /&gt;
&lt;br /&gt;
通常而言，更好的方法是获取一个代理对象。代理对象是一个简单的表，为各个API回调提供同名的的函数。此外，每个代理都有两个字段：`address`，用来保存被包装的组件的地址。`type`，用来保存组件的类型。你可以通过这种方法获得代理对象： ```lua local component = require(&amp;quot;component&amp;quot;) local proxy = component.proxy(address)&lt;br /&gt;
&lt;br /&gt;
-- 上文调用的使用代理对象版本： proxy.broadcast(port, data)&lt;br /&gt;
&lt;br /&gt;
-- 常见的代理对象字段： print(proxy.address) -- 传给上述component.proxy的地址 print(proxy.type) -- &amp;quot;modem&amp;quot; ```&lt;br /&gt;
&lt;br /&gt;
请注意，通过`component.getPrimary`或`component.xxx`访问的首选组件实际上都是代理对象。&lt;br /&gt;
&lt;br /&gt;
== 直接调用 ==&lt;br /&gt;
&lt;br /&gt;
一些组件的回调可以以&amp;quot;直接调用&amp;quot;的形式执行。直接调用是在计算机的工作线程中进行的，这意味着它们会立即返回。普通调用会被委托给主服务端线程，以避免出现竞态问题或其他线程问题，这也意味着普通调用至多会需要一tick（即50ms）才能完成。这里明确一下：只有component(组件) API会有这种情况。&lt;br /&gt;
&lt;br /&gt;
== 信号 ==&lt;br /&gt;
&lt;br /&gt;
[[Component/signals/zh|信号]]是于组件交互时很重要的一部分。信号可以被组件推入队列，以通知电脑外部变化和事件。例如，用户的输入就是通过信号转发给电脑的。电脑也可以将自己的信号加入队列，这有助于代码复用，或者只是异步通知你代码的其他部分。&lt;br /&gt;
&lt;br /&gt;
== 目录 ==&lt;br /&gt;
&lt;br /&gt;
{{:Component/contents/zh}}&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;OCDoc Import</name></author>
	</entry>
</feed>