FreeKill/docs/fkp/usr/func_array.rst

144 lines
4.9 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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