<?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=API%2Ftransforms%2Fzh</id>
	<title>API/transforms/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=API%2Ftransforms%2Fzh"/>
	<link rel="alternate" type="text/html" href="https://ocr.michiyo.me/w/index.php?title=API/transforms/zh&amp;action=history"/>
	<updated>2026-08-24T15:14:45Z</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=API/transforms/zh&amp;diff=1057&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=API/transforms/zh&amp;diff=1057&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;= Transforms(变换) =&lt;br /&gt;
&lt;br /&gt;
transforms(变换)库提供了一套用于带索引表的实用工具。此运行库提供了高度可复用的特殊迭代器，这些迭代器是`text`与`sh`命令解析的核心。&lt;br /&gt;
&lt;br /&gt;
== Transforms(变换) API ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Transforms工作于序列之上&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;所有transform方法都预期在序列上迭代，参见https://www.lua.org/manual/5.2/manual.html#3.4.6。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;first 与 last&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;此API中所有的`first`和`last`参数均与`string`方法（例如`string.sub`）中的`first`与`last`参数工作方式一致。也就是可以接收负值，负值为从后向前数。`first`（当选择时）默认相当于 1，而 `last` 默认相当于 -1。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;判断函数（predicate）&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;译者注：此处的predicate通用的译名是“谓词”，指根据条件返回布尔值的函数。但译者认为这是相当糟糕的译名，不利于理解。因此译为“判断函数”。  &lt;br /&gt;
所有接收判断函数的transform方法均使用以下的判断函数定义：  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `predicate(element: value, index: number, tbl: table): number, number`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;此判断函数会在`tbl`的每个索引值上依次调用。`element`为`tbl[index]`的值。  &lt;br /&gt;
通常而言，判断函数将会忽略`index`与`tbl`，仅处理`element`。但一些判断函数可能会需要检查`tbl`中在`index`之前或之后的值。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;应注意&amp;#039;&amp;#039;&amp;#039;，传递给判断函数的`tbl`实际上只是传递给transform api的原始表的一个&amp;#039;&amp;#039;&amp;#039;视图（view）&amp;#039;&amp;#039;&amp;#039;。此处的&amp;#039;&amp;#039;&amp;#039;视图&amp;#039;&amp;#039;&amp;#039;不是原生的序列，而是只有`tbl`中[`first`, `last`]范围内的值。&lt;br /&gt;
换言之，判断函数处理“一组元素”，并返回代表所满足条件的值。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  * **元素组**  &lt;br /&gt;
  &amp;quot;元素组&amp;quot;一词代指下列之一：  &lt;br /&gt;
  A)传递给判断函数的单个`element`。与`tbl[index]`的值为同一个。  &lt;br /&gt;
  或者  &lt;br /&gt;
  B)`tbl`中自`index`起的元素序列。判断函数可能会从`index`处开始迭代，数量为其需要检查的元素数，直到`#tbl`为止。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;返回值&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  返回值的可能情况：  &lt;br /&gt;
  参数1：若为`false` 或 `nil`，代表这组元素不满足判断函数的条件。若为`index`，代表满足条件。函数应当直接返回给定函数的索引号，也就是元素组的起始元素索引号。  &lt;br /&gt;
  参数2：满足判断函数的元素组大小，或`nil`。  &lt;br /&gt;
  一些tranform方法可能会将第二个参数指定为可选，例如`transforms.first()`。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一些transform方法可能会指定其他类型的判断类型，例如表或字符串。这些判断函数的用法特定于对应的方法，且在此处详细列出的方法中定义。&lt;br /&gt;
&lt;br /&gt;
=== 方法 ===&lt;br /&gt;
&lt;br /&gt;
* `transforms.sub(tbl: table, first: number, last: number or nil): table`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;与`string.sub`作用类似，返回`tbl`从`first`到`last`的子表。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* `transforms.first(tbl: table, predicate: function or table, first: number or nil, last: number or nil): number, number`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;返回`tbl`中（范围在`first`与`last`索引值之间，包含首尾）满足`predicate`的首个元素的索引值。第二个返回值为连续匹配的元素最后一个的索引值。一般而言会返回两个同样的值，即匹配的连续元素为1个。`predicate`可以返回第二个返回值（可选），代表匹配的连续元素序列长度。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当`predicate`为表时，`transforms.first()`将会返回`tbl`中首个满足条件的子表的首尾索引值，这种情况下的匹配指匹配`predicate`表中的任一元素。&lt;br /&gt;
样例：&lt;br /&gt;
&lt;br /&gt;
```lua&lt;br /&gt;
&lt;br /&gt;
local tx = require(&amp;quot;transforms&amp;quot;) print( tx.first ( { 1, 1, 3, 2, 4, 7 }, function(e, i, tbl)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local evens = 0&lt;br /&gt;
for i=i,#tbl do&lt;br /&gt;
  if tbl[i] % 2 == 0 then&lt;br /&gt;
    evens = evens + 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
return evens &amp;gt; 0, evens&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
end)) ```&lt;br /&gt;
&lt;br /&gt;
输出： ``` 4 5 ```&lt;br /&gt;
&lt;br /&gt;
```lua local tx = require(&amp;quot;transforms&amp;quot;) print( tx.first ( { 1, 1, 3, 2, 4, 7 }, { {1, 2}, {3, 2, 4} }) ) ```&lt;br /&gt;
&lt;br /&gt;
输出 ``` 3 5 ```&lt;br /&gt;
&lt;br /&gt;
* `transforms.partition(tbl: table, partioner: function, first: number or nil, last: number or nil): table of tables`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;返回一个子表的列表，子表来自`tbl`，由`partioner`生成，来源范围为从`first`到`last`。`partioner`为判断函数，定义见前文。  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
传递给`partitioner`的`index`参数将会跳过子表的范围，即此参数会增加`n`，`n`即为分区大小。&lt;br /&gt;
此方法的`partitioner`判断函数必须同时返回匹配的元素组的开始与结束索引。请再次参见前文的`predicate`相关信息。&lt;br /&gt;
* `transforms.begins(tbl: table, sub: table, first: number or nil, last: number or nil)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;若`tbl`从`first`到`last`的子表能完全组成`v`（自首个元素对齐），则返回`true`。`first`与`last`元素可以正确处理负数。上文描述也就是说：  &lt;br /&gt;
`v[1] == tbl[first + 0]`  &lt;br /&gt;
`v[2] == tbl[first + 1]`  &lt;br /&gt;
...  &lt;br /&gt;
`v[#v] == tbl[first + #v - 1]`  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此处的`first + #v - 1`在`tbl`的`[first, last]`范围内。&lt;br /&gt;
* `transforms.foreach(tbl: table, adapter: function, first: number or nil, last: number or nil)`&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;返回`tbl`中从`first`到`last`的每个元素的修改版本。若`adapter`的结果出现`nil`则会被忽略，不会被加入结果。  &lt;br /&gt;
`adapter`函数遵循判断函数的格式，除了返回值处理方面。  &lt;br /&gt;
* **Adapter函数返回值**  &lt;br /&gt;
简单的情况是返回单个值，例如`tx.foreach({&amp;#039;a&amp;#039;, &amp;#039;b&amp;#039;, &amp;#039;c&amp;#039;}, string.upper)`将会返回`{&amp;#039;A&amp;#039;, &amp;#039;B&amp;#039;, &amp;#039;C&amp;#039;}`。  &lt;br /&gt;
adapter函数可以通过返回`nil`来跳过某个值。例如，`tx.foreach({&amp;#039;1&amp;#039;, &amp;#039;foobar&amp;#039;, &amp;#039;2&amp;#039;}, function(n) return tonumber(n) end)`将会返回`{1, 2}`。  &lt;br /&gt;
`adapter`函数可以返回第二个值，此值会被用作结果的下个序号。例如`tx.foreach({&amp;#039;1&amp;#039;,&amp;#039;foobar&amp;#039;,&amp;#039;3&amp;#039;},function(n,i) return tonumber(n), tostring(i) end)`将会返回`{[&amp;quot;1&amp;quot;]=1, [&amp;quot;3&amp;quot;]=3}`&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== 目录 ==&lt;br /&gt;
&lt;br /&gt;
{{:API/contents/zh}}&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;OCDoc Import</name></author>
	</entry>
</feed>