搜索
查看: 846|回复: 6

用类的直接继承给 fsys.log 加上时间标记

[复制链接]

5

主题

17

帖子

128

积分

一级会员

Rank: 2

积分
128
发表于 2018-8-2 22:03:06 | 显示全部楼层 |阅读模式
用类的直接继承给 fsys.log 加上时间标记
=======================

使用 fsys.log 保存调试信息到文件很方便,有时我们需要查看一条日志的具体时间,fsys.log并没有这个选项,没有关系,我们可以使用类的直接继承自己加上这个功能

在 aardio.exe 所在目录创建一个文件夹,命名为 my 用来保存自定义的库文件,不建议把自己写的库放到标准库lib目录下

在 my 目录 下新建 log.aardio, 内容如下:



  1. import fsys.log
  2. import time

  3. namespace my;

  4. class log{
  5.    
  6.         ctor( path ){
  7.                 this = ..fsys.log(path) //调用基类构造对象原型
  8.         };       

  9.         //        如果 put 改成 print, 就覆盖了基类的print。要调用继承的基类的print,就要另起函数名
  10.         put = function(...){
  11.                 var t = ..time.now()
  12.                 t.format="%Y%m%d-%H%M%S";
  13.                
  14.                 var args = {...}
  15.                 ..table.insert(args, tostring(t) + "...") // 通常时间非重要信息,以...作视觉区分方便查看
  16.                
  17.                 this.print( ..table.unpack(args) )
  18.         };       
  19. }
复制代码



使用方法:
---------

  1. import my.log
  2. log = my.log()
  3. log.put(" test it")
复制代码



-----------------
给初学者的解释

我们尽量把公用代码放到库里,方便代码重用

创建库必然会碰到 class 和 namespace 的概念
第一次写库可能会疑惑,用 class log... 还是 namespace log... ?

类有构造函数,我们需要传入 log 文件的路径给构造函数,所以这里需要用 class

namespace my; 是 namespace my { ... }的一种简化写法,表示后面的代码都是属于 my 这个名字空间。类有自己的名字空间,log的完整名字空间是 my.log

我们看标准库,经常看到有同名的 class 和 namespace,这是为什么呢?
我们把静态成员放入到 namespace,应该可以提高优化的效率

如果不考虑优化,如果给 namespace 增加构造函数的功能,那么也许只用 namespace 就可以了,可以不用 class

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 12:43:48 | 显示全部楼层
在 aardio.exe 所在目录创建一个文件夹,命名为 my 用来保存自定义的库文件,


库放到exe目录是无法导入的,要放到 "~\lib\" 或 "\lib\"目录下,
也就是exe根目录下的lib目录,或者工程根目录下的lib目录。

自己创建的库放到标准库里没关系,只要不要覆盖标准库里的同名库就行了。
标准库、用户库只是查找位置不同,都可以自己添加库。
回复

使用道具 举报

5

主题

17

帖子

128

积分

一级会员

Rank: 2

积分
128
 楼主| 发表于 2018-8-3 15:10:27 | 显示全部楼层
检查了一下,我的公共库 my 确实是放在 "~\lib\my\"

因为我的自建工程放在"~\my\",误把彼 my 当 此 my了

go语言可以自定义自建库的搜索路径,看到 aardio 根目录下的my,就一时大意了

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 15:18:12 | 显示全部楼层
dongdong 发表于 2018-8-3 15:10
检查了一下,我的公共库 my 确实是放在 "~\lib\my\"

因为我的自建工程放在"~\my\",误把彼 my 当 此 my ...
go语言就相当于你可以在每个房间里放书,
aardio规定你书要放到书房的书架上,必须放到规定的位置。

如果要自定义库的位置也是可以的,使用fsys.junction创建目录链接就可以。

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 20:47:23 | 显示全部楼层
又看了一遍代码,才注意到重点,你并不需要把print函数改成别的名字:
import fsys.log
namespace my{

   
class log{
        
        
ctor( path ){
            
this = ..fsys.log(path)
            
this.basePrint = this.print;
        };      
        print =
function(...){
            
var t = ..time.now()
            t.format=
"%Y%m%d-%H%M%S";
            
            
var args = {...}
            ..table.insert(args,
tostring(t) + "...") // 通常时间非重要信息,以...作视觉区分方便查看
            
            
this.basePrint( ..table.unpack(args) )
        };        
    }
}

var log = my.log()
log.print(
"测试")


回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 20:53:47 | 显示全部楼层
简单一点这样写也可以:
import fsys.log

var log = fsys.log()
log.print( time() ,
"测试")
回复

使用道具 举报

5

主题

17

帖子

128

积分

一级会员

Rank: 2

积分
128
 楼主| 发表于 2018-8-4 08:58:32 | 显示全部楼层
把本机代码按照你的改进同步了一下。同样功能函数保持与标准库同名比较好

因为 time 库是默认导入的,直接用标准库,输出 加上 time() 也是很方便的:
log.print( time() , "test it")
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-12-17 18:15 , Processed in 0.062500 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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