You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:56:09