添加的内容 删除的内容
无编辑摘要 |
无编辑摘要 |
||
第224行: | 第224行: | ||
==== 数字(number) ==== |
==== 数字(number) ==== |
||
Lua只有一种数字类型,就是典型的[[ |
Lua只有一种数字类型,就是典型的[[双精度浮点数|双精度浮点数]]。这种格式下,-9007199254740992到9007199254740992之间的整数都会准确表达,更大的数和带有小数部分的数将会受到舍入的误差。 |
||
数字可以用点(<code>.</code>)来表示小数,例如<code>123456.78</code>。数字也可以用不带空格的[[ |
数字可以用点(<code>.</code>)来表示小数,例如<code>123456.78</code>。数字也可以用不带空格的[[科学计数法|科学计数法]],例如<code>1.23e-10</code>、<code>123.45e20</code>或者<code>1.23E5</code>。也可以用16进制表示整数,方法就是以<code>0x</code>开头,例如<code>0x3A</code>。 |
||
虽然[[ |
虽然[[NaN|NaN]]和正负无穷大都可以正确地储存、处理,但是Lua不提供相应的直接文字表示方法。<code>math.huge</code>是正无穷大,相当于<code>1/0</code>,此外,像<code>0/0</code>这样的除法就可以生成NaN。 |
||
重申一遍,在转化为布尔值时,任何数字都会被视为true。这不像其他语言,数字0通常视为false。数字在转化为字符串时,数字都会被视为有限小数和科学计数;NaN是<syntaxhighlight lang="lua" inline>"nan"</syntaxhighlight>或者<syntaxhighlight lang="lua" inline>"-nan"</syntaxhighlight>;无穷大就是<syntaxhighlight lang="lua" inline>"inf"</syntaxhighlight>或<syntaxhighlight lang="lua" inline>"-inf"</syntaxhighlight>。 |
重申一遍,在转化为布尔值时,任何数字都会被视为true。这不像其他语言,数字0通常视为false。数字在转化为字符串时,数字都会被视为有限小数和科学计数;NaN是<syntaxhighlight lang="lua" inline>"nan"</syntaxhighlight>或者<syntaxhighlight lang="lua" inline>"-nan"</syntaxhighlight>;无穷大就是<syntaxhighlight lang="lua" inline>"inf"</syntaxhighlight>或<syntaxhighlight lang="lua" inline>"-inf"</syntaxhighlight>。 |
||
第288行: | 第288行: | ||
Lua中的函数是一等的(first-class)的值:可以匿名创建,或作为参数传递,或给变量赋值,等等。 |
Lua中的函数是一等的(first-class)的值:可以匿名创建,或作为参数传递,或给变量赋值,等等。 |
||
函数通过<code>function</code>(“函数”的英文)关键字,并使用圆括号调用。有一些[[ |
函数通过<code>function</code>(“函数”的英文)关键字,并使用圆括号调用。有一些[[语法糖|语法糖]]可以用来命名函数,局部函数,并且可以作为表中的一个域值。参看[[#Function declarations|函数声明]]和[[#Function calls|函数调用]]。 |
||
Lua函数是[[ |
Lua函数是[[闭包 (计算机科学)|闭包]],这意味着它们维护对它们声明的作用域的引用,并可以访问和操作该作用域中的变量。 |
||
类似于表,如果函数一个函数被分配给另一个变量,或者作为参数传递给另一个函数,它仍然是相同的被调用的底层“函数对象”。 |
类似于表,如果函数一个函数被分配给另一个变量,或者作为参数传递给另一个函数,它仍然是相同的被调用的底层“函数对象”。 |
||
第448行: | 第448行: | ||
==== 运算优先级 ==== |
==== 运算优先级 ==== |
||
Lua的[[ |
Lua的[[操作符]]优先级,从高到低为: |
||
# ^ |
# ^ |
||
第519行: | 第519行: | ||
函数被调用时,''block''中的语句会在由''var-list''创建与变量表对应的局部变量和指定值之后执行。如果执行到[[#return|返回语句]],语句块就会退出,函数调用表达式的值就会是返回语句给予的值。如果执行到代码段末尾,还没有返回语句,则函数调用返回的结果是0个值。 |
函数被调用时,''block''中的语句会在由''var-list''创建与变量表对应的局部变量和指定值之后执行。如果执行到[[#return|返回语句]],语句块就会退出,函数调用表达式的值就会是返回语句给予的值。如果执行到代码段末尾,还没有返回语句,则函数调用返回的结果是0个值。 |
||
Lua函数是[[ |
Lua函数是[[闭包 (计算机科学)|词法闭包]]。一个常见的习惯用法是在函数声明的作用域内声明“私有静态(private static)”变量作为局部变量。比如, |
||
<syntaxhighlight lang="lua"> |
<syntaxhighlight lang="lua"> |
||
第673行: | 第673行: | ||
返回语句用来返回从函数或者[[#chunk|代码块]](只是一个函数)。''表达式列表''是由逗号分隔开的零个或更多个表达式。 |
返回语句用来返回从函数或者[[#chunk|代码块]](只是一个函数)。''表达式列表''是由逗号分隔开的零个或更多个表达式。 |
||
Lua实现[[ |
Lua实现[[尾调用|尾调用(tail calls)]]。如果表达式列表包含一个函数调用,对那个函数的调用会重新使用当前的堆栈项(stack frame)。这可用于处理调用堆栈的函数,比如<code>[[#getfenv|getfenv()]]</code>和<code>[[#debug.traceback|debug.traceback()]]</code>。 |
||
返回语句必须是[[#block|语句块]]的最后一个语句。如果某些原因语句块的中间需要返回,那么可能需要明显的语句块<code style="white-space:nowrap">do return end</code>。 |
返回语句必须是[[#block|语句块]]的最后一个语句。如果某些原因语句块的中间需要返回,那么可能需要明显的语句块<code style="white-space:nowrap">do return end</code>。 |
||
第854行: | 第854行: | ||
用指定的参数在“保护模式”下调用函数<code>f</code>。这意味着如果在调用<code>f</code>时出错,pcall会返回false与错误消息。如果没有错误发生,pcall会返回true与调用返回的所有值。 |
用指定的参数在“保护模式”下调用函数<code>f</code>。这意味着如果在调用<code>f</code>时出错,pcall会返回false与错误消息。如果没有错误发生,pcall会返回true与调用返回的所有值。 |
||
用[[ |
用[[伪代码|伪代码]]表示,<code>pcall</code>的定义类似如下: |
||
<syntaxhighlight lang="lua"> |
<syntaxhighlight lang="lua"> |
||
第913行: | 第913行: | ||
<code>base</code>是可选的,默认为10,指定解析数字的进位基数。这个基数可以是2到36之间的任何整数。对于大于10,字母A(大小写均可)代表10,B代表11,以此类推,Z代表35。 |
<code>base</code>是可选的,默认为10,指定解析数字的进位基数。这个基数可以是2到36之间的任何整数。对于大于10,字母A(大小写均可)代表10,B代表11,以此类推,Z代表35。 |
||
十进制下,值可以有小数部分,或者以[[ |
十进制下,值可以有小数部分,或者以[[科学计数法|科学计数法]]表示,而且甚至可以以“0x”开头以表示16进制。其他情况,只会接受不带符号的整数。 |
||
==== tostring ==== |
==== tostring ==== |
||
第939行: | 第939行: | ||
这个很像<code>[[#pcall|pcall]]</code>,只是错误消息在返回之前传递到函数<code>errhandler</code>中。 |
这个很像<code>[[#pcall|pcall]]</code>,只是错误消息在返回之前传递到函数<code>errhandler</code>中。 |
||
用[[ |
用[[伪代码|伪代码]]表示,<code>xpcall</code>的定义类似如下: |
||
<syntaxhighlight lang="lua"> |
<syntaxhighlight lang="lua"> |
||
第1,095行: | 第1,095行: | ||
<code style="white-space:nowrap">math.randomseed( x )</code> |
<code style="white-space:nowrap">math.randomseed( x )</code> |
||
以<code>x</code>作为伪随机数生成器的[[ |
以<code>x</code>作为伪随机数生成器的[[伪随机数的种子|种子]]。 |
||
注意使用同一个种子会导致<code>math.random</code>输出相同的数列。 |
注意使用同一个种子会导致<code>math.random</code>输出相同的数列。 |
||
第1,147行: | 第1,147行: | ||
* hour(0~23) |
* hour(0~23) |
||
* min(0~59) |
* min(0~59) |
||
* sec(0~60,允许[[ |
* sec(0~60,允许[[闰秒|闰秒]]的情况) |
||
* wday(weekday,Sunday是1) |
* wday(weekday,Sunday是1) |
||
* yday(一年的某一天) |
* yday(一年的某一天) |
||
第1,344行: | 第1,344行: | ||
==== 匹配模式(patterns) ==== |
==== 匹配模式(patterns) ==== |
||
注意Lua的匹配模式类似于[[ |
注意Lua的匹配模式类似于[[正则表达式|正则表达式(regular expression)]],但是并不一样。特别地,注意正则表达式和[[正则表达式#PCRE表达式全集|PCRE]]之间的以下区别: |
||
* 用于引用的字符串是百分号(<code>%</code>)而非反斜杠(<code>\</code>)。 |
* 用于引用的字符串是百分号(<code>%</code>)而非反斜杠(<code>\</code>)。 |
||
第1,470行: | 第1,470行: | ||
模式可以包括用小括号括起来的子模式(sub-patterns),描述了“捕获”。匹配成功时,字符串的匹配捕获的子字符串会被存储(被“捕获”)以备使用。捕获是根据左边的括号被标号的。比如,在模式<code>(a*(.)%w(%s*))</code>中,匹配<code>a*(.)%w(%s*)</code>的字符串部分被存储在第一个捕获(所以是第一项),匹配<code>.</code>的字符被捕获,记为第2项,匹配<code>%s*</code>的则是第3项。 |
模式可以包括用小括号括起来的子模式(sub-patterns),描述了“捕获”。匹配成功时,字符串的匹配捕获的子字符串会被存储(被“捕获”)以备使用。捕获是根据左边的括号被标号的。比如,在模式<code>(a*(.)%w(%s*))</code>中,匹配<code>a*(.)%w(%s*)</code>的字符串部分被存储在第一个捕获(所以是第一项),匹配<code>.</code>的字符被捕获,记为第2项,匹配<code>%s*</code>的则是第3项。 |
||
捕获参考可以出现在字符串自身,而返回参考早前被捕获的文本。比如,<code>([a-z])%1</code>会匹配任何一对相同的小写字母,而<code>([a-z])([a-z])([a-z])[a-z]%3%2%1</code>会匹配任何7个字母的[[ |
捕获参考可以出现在字符串自身,而返回参考早前被捕获的文本。比如,<code>([a-z])%1</code>会匹配任何一对相同的小写字母,而<code>([a-z])([a-z])([a-z])[a-z]%3%2%1</code>会匹配任何7个字母的[[回文|回文]]。 |
||
特殊情况,空的捕获<code>()</code>会捕获当前的字符串位置(一个数字)。比如我们对字符串<code>"flaaap"</code>执行模式<code>"()aa()"</code>,那么会有两个捕获:3和5。 |
特殊情况,空的捕获<code>()</code>会捕获当前的字符串位置(一个数字)。比如我们对字符串<code>"flaaap"</code>执行模式<code>"()aa()"</code>,那么会有两个捕获:3和5。 |
||
第1,863行: | 第1,863行: | ||
=== 语言库 === |
=== 语言库 === |
||
语言代码在语言代码中由描述。很多MediaWiki的语言代码类似于[[ |
语言代码在语言代码中由描述。很多MediaWiki的语言代码类似于[[IETF语言标签|IETF语言标签]],但不是所有MediaWiki语言代码都是有效的IETF标签,反之亦然。 |
||
{{anchor|mw.language-object}} |
{{anchor|mw.language-object}} |
||
第2,309行: | 第2,309行: | ||
* '''prefix'''——跨wiki前缀。 |
* '''prefix'''——跨wiki前缀。 |
||
* '''url'''——跨wiki指向的URL。页面名称由参数$1体现。 |
* '''url'''——跨wiki指向的URL。页面名称由参数$1体现。 |
||
* '''isProtocalRelative'''——布尔值,显示URL是否为[[ |
* '''isProtocalRelative'''——布尔值,显示URL是否为[[URL|URL]]。 |
||
* '''isLocal'''——这个URL是否是当前wiki的站点的。 |
* '''isLocal'''——这个URL是否是当前wiki的站点的。 |
||
* '''isCurrentWiki'''——这个URL是否是为当前wiki的。 |
* '''isCurrentWiki'''——这个URL是否是为当前wiki的。 |
||
第2,326行: | 第2,326行: | ||
<code style="white-space:nowrap">mw.text.decode( s, decodeNamedEntities )</code> |
<code style="white-space:nowrap">mw.text.decode( s, decodeNamedEntities )</code> |
||
将字符串中的[[ |
将字符串中的[[HTML元素|HTML元素]]替换为对应的字符。 |
||
如果布尔值<code>decodeNameEntities</code>被省略或者为false,则只有被命名的实体“&lt;”“&gt;”“&amp;”“&quot;”和“&nbsp;”会被认可。否则,认可的HTML5命名实体的列表会从PHP的[https://php.net/get_html_translation_table <code>get_html_translation_table</code>]函数中加载。 |
如果布尔值<code>decodeNameEntities</code>被省略或者为false,则只有被命名的实体“&lt;”“&gt;”“&amp;”“&quot;”和“&nbsp;”会被认可。否则,认可的HTML5命名实体的列表会从PHP的[https://php.net/get_html_translation_table <code>get_html_translation_table</code>]函数中加载。 |
||
第2,335行: | 第2,335行: | ||
<code style="white-space:nowrap">mw.text.encode( s, charset )</code> |
<code style="white-space:nowrap">mw.text.encode( s, charset )</code> |
||
使用[[ |
使用[[HTML实体|HTML实体]]替换字符串中的字符。字符“<”“>”“&”“"”和非换行空格会被适当的命名实体替换,所有其他的都会被替换为数字实体。 |
||
如果提供了<code>charset</code>,则它应该是合适的字符串,且被[[#Ustring patterns|Ustring模式]]的括号括住,比如<code>[set]</code>中的“set”。默认的charset是<code>'<>&"\' '</code>(末尾的空格为非换行空格,U+00A0)。 |
如果提供了<code>charset</code>,则它应该是合适的字符串,且被[[#Ustring patterns|Ustring模式]]的括号括住,比如<code>[set]</code>中的“set”。默认的charset是<code>'<>&"\' '</code>(末尾的空格为非换行空格,U+00A0)。 |
||
第2,409行: | 第2,409行: | ||
<code style="white-space:nowrap">mw.text.nowiki( s )</code> |
<code style="white-space:nowrap">mw.text.nowiki( s )</code> |
||
使用[[ |
使用[[HTML实体|HTML实体]]替换字符串中的多种字符,以避免被解析为维基文本。包括: |
||
* 以下字符:<code>"</code>、<code>&</code>、<code>'</code>、<code><</code>、<code>=</code>、<code>></code>、<code>[</code>、<code>]</code>、<code>{</code>、<code>|</code>、<code>}</code> |
* 以下字符:<code>"</code>、<code>&</code>、<code>'</code>、<code><</code>、<code>=</code>、<code>></code>、<code>[</code>、<code>]</code>、<code>{</code>、<code>|</code>、<code>}</code> |
||
第2,600行: | 第2,600行: | ||
* '''pages''':如果文件格式支持多页,这是包含文件每个页面的表,否则为<code>nil</code>。[[#Length operator|“#”操作符]]可以用于获取文件页数。每个单独的页面表都包含一个width和height属性。 |
* '''pages''':如果文件格式支持多页,这是包含文件每个页面的表,否则为<code>nil</code>。[[#Length operator|“#”操作符]]可以用于获取文件页数。每个单独的页面表都包含一个width和height属性。 |
||
* '''size''':文件的字节长度。 |
* '''size''':文件的字节长度。 |
||
* '''mimeType''':文件的[[ |
* '''mimeType''':文件的[[MIME类型|MIME类型]]。 |
||
* '''length''':媒体文件的长度,单位为秒。不支持长度的媒体则为0。 |
* '''length''':媒体文件的长度,单位为秒。不支持长度的媒体则为0。 |
||
第2,614行: | 第2,614行: | ||
<code style="white-space:nowrap">mw.uri.encode( s, enctype )</code> |
<code style="white-space:nowrap">mw.uri.encode( s, enctype )</code> |
||
[[ |
[[百分号编码|百分号编码]]字符串。默认类型,<code>"QUERY"</code>,使用“+”编码空格以用于查询字符;<code>"PATH"</code>将空格编码为%20,<code>"WIKI"</code>将空格编码为“_”。 |
||
注意"WIKI"格式不是完全可以逆转的,因为空格和下划线都会编码为“_”。 |
注意"WIKI"格式不是完全可以逆转的,因为空格和下划线都会编码为“_”。 |
||
第2,621行: | 第2,621行: | ||
<code style="white-space:nowrap">mw.uri.decode( s, enctype )</code> |
<code style="white-space:nowrap">mw.uri.decode( s, enctype )</code> |
||
[[ |
[[百分号编码|百分号解码]]字符串。默认类型,<code>"QUERY"</code>,将“+”解码为空格;<code>"PATH"</code>不执行额外的解码,<code>"WIKI"</code>将“_”解码为空格。 |
||
==== mw.uri.anchorEncode ==== |
==== mw.uri.anchorEncode ==== |
||
第2,810行: | 第2,810行: | ||
<code style="white-space:nowrap">mw.ustring.toNFC( s )</code> |
<code style="white-space:nowrap">mw.ustring.toNFC( s )</code> |
||
将字符串转化为[[ |
将字符串转化为[[Unicode等价性|正规形式C]]。如果字符串不是有效的UTF-8则返回nil。 |
||
==== mw.ustring.toNFD ==== |
==== mw.ustring.toNFD ==== |
||
<code style="white-space:nowrap">mw.ustring.toNFD( s )</code> |
<code style="white-space:nowrap">mw.ustring.toNFD( s )</code> |
||
将字符串转化为[[ |
将字符串转化为[[Unicode等价性|正规形式D]]。如果字符串不是有效的UTF-8则返回nil。 |
||
==== mw.ustring.upper ==== |
==== mw.ustring.upper ==== |
||
第2,826行: | 第2,826行: | ||
==== ustring匹配模式 ==== |
==== ustring匹配模式 ==== |
||
ustring函数中的匹配模式使用和[[#Patterns|字符串库匹配模式]]相同的语法。主要区别是,字符串类会根据[[ |
ustring函数中的匹配模式使用和[[#Patterns|字符串库匹配模式]]相同的语法。主要区别是,字符串类会根据[[Unicode字符属性]]重新定义。 |
||
* '''<code>%a</code>''':代表一般类别“控制”中的所有字符。 |
* '''<code>%a</code>''':代表一般类别“控制”中的所有字符。 |
||
第2,852行: | 第2,852行: | ||
bit32 = require( 'bit32' ) |
bit32 = require( 'bit32' ) |
||
bit32库提供了无符号的32位整数的[[ |
bit32库提供了无符号的32位整数的[[位运算|位运算]]。输入的整数会被截成整数(方法未指定)并用2<sup>32</sup>模除,这样值就是在0到2<sup>32</sup>-1之间的,返回的值也会是这个范围。 |
||
如果字节被编号(就像[[#bit32.extract|bit32.extract()]]中那样),那么0是最低位的字节(带有值2<sup>0</sup>的),31是最高位的(带有值2<sup>31</sup>的)。 |
如果字节被编号(就像[[#bit32.extract|bit32.extract()]]中那样),那么0是最低位的字节(带有值2<sup>0</sup>的),31是最高位的(带有值2<sup>31</sup>的)。 |
||
第2,904行: | 第2,904行: | ||
<code style="white-space:nowrap">bit32.lshift( n, disp )</code> |
<code style="white-space:nowrap">bit32.lshift( n, disp )</code> |
||
返回数<code>n</code>向左[[ |
返回数<code>n</code>向左[[位操作#移位|移动]]<code>disp</code>位。这是一个[[位操作#逻辑移位|逻辑移位]]:插入的位为0。这通常相当于乘以2的<code>disp</code>次方。 |
||
请注意,超过31的位移将导致0。 |
请注意,超过31的位移将导致0。 |
||
第2,911行: | 第2,911行: | ||
<code style="white-space:nowrap">bit32.rshift( n, disp )</code> |
<code style="white-space:nowrap">bit32.rshift( n, disp )</code> |
||
返回数<code>n</code>向右[[ |
返回数<code>n</code>向右[[位操作#移位|移动]]<code>disp</code>位。这是一个[[位操作#逻辑移位|逻辑移位]]:插入的位为0。这通常相当于除以2的<code>disp</code>次方。 |
||
请注意,超过31的位移将导致0。 |
请注意,超过31的位移将导致0。 |
||
第2,918行: | 第2,918行: | ||
<code style="white-space:nowrap">bit32.arshift( n, disp )</code> |
<code style="white-space:nowrap">bit32.arshift( n, disp )</code> |
||
返回数<code>n</code>向右[[ |
返回数<code>n</code>向右[[位操作#移位|移动]]<code>disp</code>位。这是一个[[算数移位|算数移位]]:如果<code>disp</code>是正的,那么插入的位将会与原始数字的31位相同。 |
||
注意超过31的移位将会导致0或4294967295。 |
注意超过31的移位将会导致0或4294967295。 |