为何在Pkl中需多次使用new?生成JSON数组时尤为明显
简化Pkl代码中重复的
new关键字写法 我写了如下Pkl代码:
class Check_run_delete_olds { hidden days: Int hidden shortname: String name = "\(shortname) Runs OK And At Least Once In The Past \(days) Day(s)" filters: Any } imapserver = "imap.gmail.com" login = "me@gmail.com" password = "nope" handlers = new Dynamic { new Check_run_delete_olds { shortname = "foo" days = 3 filters = new Dynamic { new { Match = new { From = " <puppet_cron_stodi@myhost.org>$" } } new { Match = new { Subject = "^Cron " } } new { Match = new { Subject = "puppet agent" } } } } }
执行后得到符合需求的JSON输出:
$ ./pkl eval -f json test.pkl
{ "imapserver": "imap.gmail.com", "login": "me@gmail.com", "password": "nope", "handlers": [ { "name": "foo Runs OK And At Least Once In The Past 3 Day(s)", "filters": [ { "Match": { "From": " <puppet_cron_stodi@myhost.org>$" } }, { "Match": { "Subject": "^Cron " } }, { "Match": { "Subject": "puppet agent" } } ] } ] }
但代码里要反复用new关键字,尤其是生成JSON数组对象时用得特别多。有没有更简洁、符合Pkl惯用写法的方式实现相同输出?
简化方案
Pkl支持用数组字面量直接定义数组,不需要嵌套new Dynamic;同时对于匿名对象,可以省略new关键字直接用{}定义,这样能大幅减少new的使用:
class Check_run_delete_olds { hidden days: Int hidden shortname: String name = "\(shortname) Runs OK And At Least Once In The Past \(days) Day(s)" filters: Any } imapserver = "imap.gmail.com" login = "me@gmail.com" password = "nope" handlers = [ new Check_run_delete_olds { shortname = "foo" days = 3 filters = [ { Match = { From = " <puppet_cron_stodi@myhost.org>$" } }, { Match = { Subject = "^Cron " } }, { Match = { Subject = "puppet agent" } } ] } ]
关键简化点:
- 用
[]数组字面量替代new Dynamic { new ... }来定义数组,这是Pkl中定义数组的惯用写法 - 匿名对象直接用
{}创建,省略new关键字(Pkl允许这种简写)
执行这段代码后,生成的JSON输出和原代码完全一致,同时代码更简洁易读,符合Pkl的语法习惯。
内容的提问来源于stack exchange,提问作者rlpowell
相关产品推荐
相关产品推荐

