scala - 如何在 Netlogo 扩展中使用 Optional
问题描述
我想创建一个可能接收布尔值或不接收布尔值的 netlogo 原语。因此,我想让用户使用这两种方式的原语成为可能:
1:
ask Walkers [
qlearningextension:learning
]
2:
ask Walkers [
qlearningextension:learning true
]
我试图用 OptionalType 来做到这一点,但我做不到。有可能做我想做的事吗?如果是这样,我该怎么做?
解决方案
所以OptionalType
不幸的是只适用于CommandBlockType
. 有关其工作原理的sample-scala
一个很好的示例,请查看扩展名(也许这是您最初看到对它的引用的地方)。 OptionalType
不会与BooleanType
.
有一个次要选项,这有点hacky。你可以在你的语法中使用withRepeatableType
设置(所以 NetLogo 知道参数是好的/预期的)。斯卡拉代码示例:defaultOption
minimumOption
0
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)
. 如果您的代码忽略它们,它们将不会产生影响,但它们可能会让扩展用户感到困惑或奇怪。
推荐阅读
- latex - 使用 RMarkdown 编织“大于或等于”符号时 PDF 输出失败
- flash - 闪存实现中的循环缓冲区
- java - 无法在 JSP 页面中显示图像
- javascript - 使用回调函数查询
- c++ - 为什么在 c++20 中不推荐使用 std::filesystem::u8path?
- android - 如何将数据从 Activity 传递到 CustomView?
- javascript - 如何通过 sequelize.js 使用云端数据库?
- azure - 配置了 Azure AD RBAC 的 Azure DevOp Pipelines 对 AKS 的身份验证?
- amazon-web-services - SES 指标显示已投递的邮件,但它从未出现在邮箱中
- bash - 替换/替换字符以在 Bash 中重命名文件