如果你要写命令行的程序,D语言Tango库的Arguments模块是必用的。这个模块的使用并不复杂,但使用时还是有一些地方要注意的。D语言目前的现状就是教程比较少,很多时候必须自己去读源代码。
我把Tango库通过svn工具导出到本地,发现example\system\arguments.d是个示例模块,可惜的是这个模块的代码是过时的,还是要到Arguments模块中去读源代码。
http://www.d-programming-language-china.org/tango-arguments-jiao-cheng/下面是个示例程序.
//by D语言中国 http://www.d-programming-language-china.org/
import tango.util.Arguments;
import tango.io.Stdout;
//for isDigits, http://dwin.d-programming-language-china.org/
import dwin.text.Unicode;
import Path = tango.io.Path;
void main()
{
auto args = new Arguments();
bool digitsValidation(char[][] args, out char[] invalidArg)
{
if(!isDigits(args[0]))
{
invalidArg = args[0];
Stdout.formatln("not a number: {}", args[0]);
return false;
}
return true;
}
//要先设定参数值的数目,否则validation无效
args.define("port").parameters(1).validation(&digitsValidation);
try
{
args.parse(["--port", "50");
}
catch(Exception e)
{
Stdout.formatln("error {}", e.msg);
}
}
先定义好校验参数的函数,如digitsValidation, 在绑定校验参数时,要先设定参数值的数目,否则validation无效,这是一个技巧。D语言Tango的Arguments模块的其他一些功能,你可以自己去读源代码。
要注意的是,现在Arguments还不完善,还有不少bug, 比如,你定义一个argument required,在命令中没有包括这个argument时,会引发exception: Argument is required but was not discovered, 并没有报告是哪个argument, 这样就不太实用。现在,我的做法是这样检测:
如果不带parameter, 可以用
if(args.contains("argument"))
{
//do something
}
如果带parameter, 就要这样用:
if(args.parameters["argument"].length)
{
//do something
}
暂时就这样做吧。Tango模块太多了,有一些Bug修复比较慢些。
本文环境:DMD 1.037, D语言库DWin http://dwin.d-programming-language-china.org/ 0.38, Tango 0.997
http://www.d-programming-language-china.org/tango-arguments-jiao-cheng/强大的命令行参数解析模块Arguments
