首页 > 解决方案 > 如何在 Netlogo 扩展中使用 Optional

问题描述

我想创建一个可能接收布尔值或不接收布尔值的 netlogo 原语。因此,我想让用户使用这两种方式的原语成为可能:

1:

ask Walkers [
    qlearningextension:learning
]

2:

ask Walkers [
    qlearningextension:learning true
]

我试图用 OptionalType 来做到这一点,但我做不到。有可能做我想做的事吗?如果是这样,我该怎么做?

标签: scalanetlogo

解决方案


所以OptionalType不幸的是只适用于CommandBlockType. 有关其工作原理的sample-scala一个很好的示例,请查看扩展名(也许这是您最初看到对它的引用的地方)。 OptionalType不会与BooleanType.

有一个次要选项,这有点hacky。你可以在你的语法中使用withRepeatableType设置(所以 NetLogo 知道参数是好的/预期的)。斯卡拉代码示例:defaultOptionminimumOption0

object RepeatableTypeTest extends api.Command {
  override def getSyntax =
    commandSyntax(
      right = List(BooleanType | RepeatableType),
      defaultOption = Some(0),
      minimumOption = Some(0)
    )

  def perform(args: Array[api.Argument], context: api.Context) {
    println(args.length)
    if (args.length > 0) {
      val ref = args(0).getBoolean
      println(ref)
    } else {
      println("No argument given!")
    }
  }
}

然后你只需要用括号中的布尔参数包装调用,这样 NetLogo 就知道你没有开始一个新命令(它期望defaultOption没有括号):

to test
  sample-scala:rep-bool
  (sample-scala:rep-bool true)
  (sample-scala:rep-bool false)
  (sample-scala:rep-bool false true false true false)
end

如您在示例中所见,这样做的问题是,如果您的用户愿意,他们可以提供额外的无用布尔值:(sample-scala:rep-bool false true false false true false false). 如果您的代码忽略它们,它们将不会产生影响,但它们可能会让扩展用户感到困惑或奇怪。


推荐阅读