搜索
查看: 2436|回复: 12

config库的存取限制

[复制链接]

3

主题

6

帖子

34

积分

新手入门

Rank: 1

积分
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

主题

874

帖子

4704

积分

荣誉会员

Rank: 8Rank: 8

积分
4704
发表于 2015-1-13 16:42:28 | 显示全部楼层

你的代码完全没有问题,config完全可以正常的序列化你所说的数组。 测试没有问题。 仔细检查一下你的代码,是不是其他什么搞错了。

你的代码完全没有问题,config完全可以正常的序列化你所说的数组。
测试没有问题。

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

使用道具 举报

4

主题

874

帖子

4704

积分

荣誉会员

Rank: 8Rank: 8

积分
4704
发表于 2015-1-13 16:51:53 | 显示全部楼层

类似问题最好是附上错误信息, 推测你出错的代码是不是这样写的: config.player.scenes.name = {a=123;b=334;}

类似问题最好是附上错误信息,
推测你出错的代码是不是这样写的:
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

主题

6

帖子

34

积分

新手入门

Rank: 1

积分
34
 楼主| 发表于 2015-1-13 17:24:35 | 显示全部楼层

已知错误所在,结贴!

已知错误所在,结贴!
回复

使用道具 举报

0

主题

11

帖子

71

积分

一级会员

Rank: 2

积分
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

积分

一级会员

Rank: 2

积分
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

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 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

积分

一级会员

Rank: 2

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

使用道具 举报

0

主题

23

帖子

116

积分

一级会员

Rank: 2

积分
116
发表于 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

帖子

116

积分

一级会员

Rank: 2

积分
116
发表于 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

积分

一级会员

Rank: 2

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

使用道具 举报

12

主题

309

帖子

1798

积分

荣誉会员

Rank: 8Rank: 8

积分
1798
发表于 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 )
就是这样同一个语法特性,用好了就是语法糖,用不好就是灾难。

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-12-14 02:52 , Processed in 0.109375 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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