aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 10761|回复: 12

config库的存取限制

[复制链接]

3

主题

3

回帖

34

积分

新手入门

积分
34
发表于 2015-1-13 16:21:13 | 显示全部楼层 |阅读模式
写入简单的字符,数字,一维数组可以成功。
config.player.scenes = {name="a";tile="123"};

写入二维的数组失败。
config.player.scenes = {name={a=123;b=334;};tile="123"};

如何存储复杂一点的配置呢?

有什么序列化/反序列化的函数吗?类似于php里面的serialize/unserialize, 方便在字符和数组之间转换,如果支持的话,持久存储复杂结构就简单多了。

4

主题

852

回帖

4689

积分

荣誉会员

积分
4689
发表于 2015-1-13 16:42:28 | 显示全部楼层
你的代码完全没有问题,config完全可以正常的序列化你所说的数组。
测试没有问题。

仔细检查一下你的代码,是不是其他什么搞错了。

4

主题

852

回帖

4689

积分

荣誉会员

积分
4689
发表于 2015-1-13 16:51:53 | 显示全部楼层
类似问题最好是附上错误信息,
推测你出错的代码是不是这样写的:
config.player.scenes.name = {a=123;b=334;}

注意这里有逻辑错误,config.player会被序列化为一个表,
而这时候 config.player.scenes 如果为空值的话,你写 config.player.scenes.name  当然就不对了。

你需要判断一下,例如:
if( config.player.scenes  === null ){
    config.player.scenes = {name={a=123;b=334;};tile=
"123"};
}
else {
    config.player.scenes.name.a = 456;
}


3

主题

3

回帖

34

积分

新手入门

积分
34
 楼主| 发表于 2015-1-13 17:24:35 | 显示全部楼层
已知错误所在,结贴!

0

主题

11

回帖

71

积分

一级会员

积分
71
发表于 2017-8-20 19:06:04 | 显示全部楼层
如果是第一次运行,config文件还没自动生成的时候,程序中读取的config项初始都自动为null, 这时,如果直接用它当参数调用 popmenu.check() 用来设置菜单的选中状态,会发现不是自动将null当作false, 而是当作true处理的。下面代码:
  1. config.leonedit.wrap=config.leonedit.wrap?true:false;
  2. winform.popmenu.check(5,config.leonedit.wrap);
复制代码

如果没有第一句,首次运行第二句后,该菜单项是选中状态,也就是说,从config中读取的null,传入check()后被当成了true,不知道这是不是一个bug?

0

主题

11

回帖

71

积分

一级会员

积分
71
发表于 2017-8-20 20:19:42 | 显示全部楼层
aardi 发表于 2017-8-20 19:06
如果是第一次运行,config文件还没自动生成的时候,程序中读取的config项初始都自动为null, 这时,如果直接 ...

查看了popmenu.check()的源码:
  1. check = function(id,chk=true,flag){
  2.                 if( flag === null ) flag = 0x400/*_MF_BYPOSITION*/;
  3.                 chk = chk ? 0x8/*_MF_CHECKED*/ : 0x0/*_MF_UNCHECKED*/
  4.                 CheckMenuItem(this.handle,flag&0x400==0?id:id-1,flag | chk );
  5.         }
复制代码

可能是这个意思: 参数chk如果是null, 会被当成缺失一样处理, 那么将被缺省参数(true)代替,结果就成了true. 这个也算是aardio的一个特性。除了像我第一句那样显性赋个值,有没有更简洁的处理方法呢?

12

主题

645

回帖

3938

积分

荣誉会员

子非魚、安知魚之樂

积分
3938
发表于 2017-9-22 23:35:27 | 显示全部楼层
aardi 发表于 2017-8-20 20:19
查看了popmenu.check()的源码:

可能是这个意思: 参数chk如果是null, 会被当成缺失一样处理, 那么将 ...

直接赋值 config.leonedit.wrap = 0
aardio 认为 0 为false
而 null 是空类型  没有赋值就只有用默认参数 true 了
这也是方便使用 毕竟第一次用check() 都是想选中的 因为开始都是没选的

0

主题

11

回帖

71

积分

一级会员

积分
71
发表于 2017-9-23 11:34:54 | 显示全部楼层
将null等同于缺失(缺省),好像不是一个好主意。似乎PHP里面是有区别的,我记得。不过也算是各有千秋吧。

0

主题

23

回帖

121

积分

一级会员

积分
121
发表于 2017-9-23 12:29:54 | 显示全部楼层
本帖最后由 strong 于 2017-9-23 12:38 编辑
aardi 发表于 2017-8-20 19:06
如果是第一次运行,config文件还没自动生成的时候,程序中读取的config项初始都自动为null, 这时,如果直接 ...
config.leonedit.wrap=config.leonedit.wrap?true:false;
winform.popmenu.check(5,config.leonedit.wrap);

这个写法是错误的,不用搞这么复杂。

winform.popmenu.check函数的第二个参数是一个布尔值。
如果你想把一个不存在的null值作为false来使用( 也就是说你不想使用函数自己的默认参数值 ),可以这样写:

winform.popmenu.check(5, !! config.leonedit.wrap);

!!把任何变量值转换为布尔值,
计算机是死的,你要明确的告诉计算机你要做什么。

0

主题

23

回帖

121

积分

一级会员

积分
121
发表于 2017-9-23 12:37:27 | 显示全部楼层
aardi 发表于 2017-9-23 11:34
将null等同于缺失(缺省),好像不是一个好主意。似乎PHP里面是有区别的,我记得。不过也算是各有千秋吧。

aardio不像Javascript的仅仅是一个空值就复杂到可以写一本书,
每个语言都有不同的方式,不是一定要搞复杂才是好主意。如果非要搞一个 null2 来表示空值,再用 null 来表示 定义了的空值,这就一定是个好主意?!

aardio会自动把 eonedit.wrap 初始化为null ”  这句话是错误的。
没初始化的变量、根本就不存在的变量在aardio里才是null

如果随手写了一个变量,没有正确初始化为任何值,就指望有达到预期的结果这是很困难的, 对于这个字段他期望的是初始值是false,如果另一个字段他期望的值是12345呢?! 所以对于配置文件,应当像下面这样做明确的的首次初始化设置:

//初始化了吗
if( ! config.init }{
   
   
//第一次初始化所有的值
    config.init = true;
    config.onedit = { wrap =
false; wrap2 = 123 }
}

0

主题

11

回帖

71

积分

一级会员

积分
71
发表于 2017-9-23 21:06:21 | 显示全部楼层
用!!来把null(不存在的config里的变量)转成false很不错,比在前面加一句“?true:false”强太多了!那么有没有类似的简洁方法,把null转成数值0,用在只接受数值的场合呢? 我试了tonumber()不行,不能对null进行转换。

13

主题

294

回帖

1790

积分

荣誉会员

积分
1790
发表于 2017-9-24 00:13:22 | 显示全部楼层
aardi 发表于 2017-9-23 21:06
用!!来把null(不存在的config里的变量)转成false很不错,比在前面加一句“?true:false”强太多了!那么有 ...

其实两种写法没有好坏之分,后面一种写法也可以简单点:
check(5, wrap ? true : false );
不能光追求写法上的“简洁”,你的配置文件第一次使用前就应当自己做一下初始化。


后面的一个问题,null不能当0来用, 变量为null通常是返回了不存在的值,但是值为0就是完全不同的性质,如果你确认了null不是错误的值,写成 tonumber( null : 0 ) 就行了,或者在定义函数时用允许null转换为0,例子:

add1 = function( a = 0  ){
   
return a + 1;
}

var c =  add1( null )
就是这样同一个语法特性,用好了就是语法糖,用不好就是灾难。

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-9-24 16:51:17 | 显示全部楼层
config(实际上是fsys.table) 已经提供了设置默认值的函数:
config.leonedit.mix(
   键名 = 默认值;
   键名2 = 默认值;
);

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-6-5 00:03 , Processed in 0.094302 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表