FreeKill/docs/fkp/usr/func_array.rst

142 lines
4.9 KiB
ReStructuredText
Raw Normal View History

函数定义和调用,以及数组
========================
fkparse多少也算一门编程语言了或许因此对函数的支持自然也必不可少。本章向大家介绍在使用fkparse时如何定义和调用自己的函数。
定义函数
--------
所谓函数,其实就是一段给定了一些前提条件(也就是函数参数)的代码块而已。通过定义函数,我们少写许多重复的代码。在三国杀这个体系中,“函数”大约就相当于“定义新概念”吧。三国杀也是通过定义一堆新概念来减少描述字数的,虽然搞得有点儿难懂=
=
fkparse中定义一个函数的格式如下
::
定义函数 <标识符> <定义参数表> [返回 <类型标识符>] <代码块>
定义函数的位置也有讲究,所有的函数必须定义在第一个技能之前,也就是说所有的函数都定义完成后才能开始自定义技能。
这里我们又遇到了两个没有见过的新东西:\ ``<参数表>``\ 和\ ``<类型标识符>``\ 。下面一起来看看吧。
类型标识符
~~~~~~~~~~
类型标识符是一个词法单元,它可以取如下的一些格式:\ *数字类型、布尔类型、字符串类型、玩家类型、卡牌类型、数字数组、字符串数组、玩家数组、卡牌数组*\ 。这些东西都不需要引号,它们用来指定一些变量的类型。
定义参数表
~~~~~~~~~~
所谓定义参数表,就是函数定义的时候用到的参数表,这个取名主要是为了和“调用参数表”区分开来。(至于调用参数表又是啥,后面就知道了)
定义\ ``<定义参数表>``\ 的格式如下:
::
'(' { <定义参数> ',' } [定义参数] ')'
而\ ``<定义参数>``\ 的格式为:
::
<标识符> ':' <类型标识符> [ '=' <表达式> ]
<标识符>是参数的名称,<类型标识符>表示这个参数需要的类型。后面的<表达式>表示这个参数的默认值。
定义好定义参数表后,函数体(也就是函数定义的格式的那个<代码块>)就可以随意将参数当做已经定义了的变量使用了,类似其他编程语言那样。
如果函数有返回类型,那么别忘记在某处使用返回语句。
调用函数
--------
定义了函数后,自然还有函数的调用了。调用函数的格式为:
::
<标识符> <参数表>
参数表
~~~~~~
相对于定义参数表,调用函数时候的参数表格式为:
::
'(' { <参数> ',' } [参数] ')'
参数的格式为:
::
<标识符> ':' <表达式>
<标识符>是对应于函数定义那里的那个参数的名字,<表达式>则是参数的取值。
需要注意的是,在调用函数时的参数表中,各个参数没有顺序要求(毕竟已经指明参数的名字了),但是对于没有默认值的参数,必须手动给它指定值。
由于函数调用既能用来执行一些动作,又能产生值,所以它既可以作为表达式,又可以作为语句。但是当单独的函数调用作为语句的时候,需要在后面跟上一个分号,表示这是一个单独的语句。
对数组的操作
------------
fkparse提供了数组类型那自然必不可少的就是数组的操作了。
遍历
~~~~
所谓遍历数组,就是对数组中每个元素逐个进行某些操作。比如想要做到“对所有其他角色各造成一点伤害”,但是造成伤害的语句只允许对一个人造成伤害,这时候我们就需要遍历“其他角色”这个数组,然后一一造成伤害了。
遍历数组的格式为:
::
对 <表达式> 中每个 <标识符> 重复此流程: <代码块> 以上
其中,<表达式>是需要遍历的数组,必须为数组类型;<标识符>表示数组中正在被遍历的那个元素,可以在接下来的代码块中作为变量使用;<代码块>是循环体,也就是前面说的“某种操作”。
插入元素
~~~~~~~~
fkparse支持对数组的头部和尾部插入新元素。
从头部插入的语法为:
::
向 <表达式> 插入 <表达式>
从尾部插入的语法为:
::
向 <表达式> 追加 <表达式>
上面两个语法中,第一个<表达式>是被操作的数组,第二个表达式是要插入的元素。元素必须符合数组的类型才行。
删除元素
~~~~~~~~
fkparse支持删除数组中的某个元素。格式为
::
从 <表达式> 删除 <表达式>
上面两个语法中,第一个<表达式>是被操作的数组,第二个表达式是要删除的元素。
遍历、插入、删除这三个操作可以作为语句使用。
获得数组的信息
~~~~~~~~~~~~~~
fkparse支持获得数组的长度以及根据数组下标取得元素。这两个操作可以作为表达式使用。
要获得长度的话,直接’数组’的"长度"这样就行了。根据下标取得元素的格式为:
::
<表达式> 第 <表达式> 个元素
数组的下标从1开始。