变量用变量名唯一识别。变量名由小程序Bundle ID和短变量名两部分组成,中间用“__”连接。示例:aplt.launcher.fake__position、aplt.leagor.basic__goods。变量名中字符必须纯英文。
一、来源
变量来自两个地方。
- 内置变量。示例:last_matched_index_、hour24_time_、time_。它们都归属“内置”小程序,即变量名会是像aplt.launcher.fake__time_。
- 单任务执行后产生的输出变量。
在“任务”界面编写任务,不能定义新变量。另外,运行过程没有删除变量命令。目前只一种情况会让已有变量消失,见后面“输入变量”中“不让存在变量”。
二、单任务涉及变量
包括输入变量和输出变量,输入变量有时叫输入参数、或就叫参数。从C编程的角度看,单任务就是函数,输入变量是函数参数,输出变量是函数返回值。
2.1 输入变量
要调用单任务执行了,会按settings.cfg定义输入变量的次序依次被赋值。对赋值,小心使用让后输入变量值依赖前面的输入变量结果。因为不能保证前面的那变量一定存在。
定义输入变量值用的是if块,按这if块的“if_block.calculate”得到的是另一个变量,还是字符串,赋值可分为单变量赋值和非单变量赋值。
- 单变量赋值。if块的“calculate”结果是个变量,像“$aplt.launcher.fake__name”。这时,变量aplt.launcher.fake__name的值将原样赋值到输入变量。如果得到的结果是以“$(”开始,这是个函数,不是变量,属于下面种情况。另外,单变量赋值时,if块也可以有多个分支,只要“calculate”结果是个变量就行。
- 非单变量赋值。不是上面情况,此时“calculate”结果会进一步送去字符串化。因为if块计算结果一定是个字符串,采用非变量赋值的,输入变量值一定是字符串。
单任务解析变量值,将字符串转为浮点时,可能损失精度,要更准确值,尽可能使用单变量赋值。
输入变量不支持数组。
对单任务来说,解析判断变量值时,不但得清楚变量类型可能是字符串,还可能出现该变量就不存在。有几种情况会保证变量不让存在。
- 计算该输入变量时,要依赖其它变量,可那变量还不存在。
- if块的分支数是0。
- ttask_cpp_pair和settings.cfg的输入变量不一致,恰好这变量settings.cfg中有,但ttask_cpp_pair中没有。
不让存在变量,不仅仅是此次不会新增这变量,而是之前如果已存在这变量,那也要删除。也就是说,会保证执行这任务时,环境中不存在这变量。这是运行中变量,可能被删除的唯一情况。
2.2 ttask_cpp_pair和settings.cfg,输入变量可能不一致
在launcher,用着ttask_cpp_pair存储着各输入变量的if块。在小程序那边,会依着settings.cfg去取输入变量。这会出现ttask_cpp_pair和settings.cfg不同步情况。举个例子,单任务snapshot更新版本了,settings.cfg新增个count输入变量。但对ttask_cpp_pair,用的是还是旧配置,没有count输入变量。这会带来两个问题。
- 在任务编写界面,啥时把settings.cfg中的count同步到ttask_cpp_pair。
- 当要运行snapshot小程序了,怎么给count赋值。
对编写任务界面,啥时同步ttask_cpp_pair和settings.cfg。一旦出现单任务输入变量发生改变,像增加、删除,是在ttask2加载task_pairs_时就进行同步。同步的不仅仅是第一个task_cpp_pair,是全部。
- 只同步本机已安装的单任务。为什么不同步没安装的?——对这些没安装的,等运行该这单任务时,会在“中心”报缺少某个小程序或任务,提示让用户去下载。不同步,免得用户下载该单任务所在小程序后,又得再写变量值。
- 由于一进入界面就会同步输入变量,可能会出现界面第一次加载后,“保存”按钮就可用,那意味着有输入变量被调整。
对要运行snapshot小程序了,怎么给count赋值。目前采用方法是,环境中将不存在“count”变量。为什么不给这count变量赋值空if_block块,见上面“输入变量”。对空if_block块,那会保证该变量不存在,结果一样。
2.2 输出变量
输出变量可以是数组。