如何将 Scala 列表传递给 NetLogo
how to pass a scala List to NetLogo
我有一个 Scala 列表,我正在尝试将它传递给我的 NetLogo 模型:
> myscalalist
List(2015-01, 2015-02)
我正在尝试这个:
App.app.command("set months " + myscalalist)
但我在 ABM 的第 47 行收到错误 class:
Illegal number format at position 54 in
at org.nlogo.lex.Tokenizer.tokenize(Tokenizer.scala:30)
at org.nlogo.lex.Tokenizer.tokenize(Tokenizer.scala:26)
at org.nlogo.compiler.CompilerMain$.compile(CompilerMain.scala:23)
at org.nlogo.compiler.Compiler$.compileMoreCode(Compiler.scala:34)
at org.nlogo.workspace.Evaluator.org$nlogo$workspace$Evaluator$$invokeCompiler(Evaluator.scala:175)
at org.nlogo.workspace.Evaluator.evaluateCommands(Evaluator.scala:18)
at org.nlogo.workspace.AbstractWorkspaceTraits$Evaluating$class.evaluateCommands(AbstractWorkspaceScala.scala:163)
at org.nlogo.workspace.AbstractWorkspaceScala.evaluateCommands(AbstractWorkspaceScala.scala:19)
at org.nlogo.app.App.command(App.scala:849)
at main.jago.ABM$$anonfun$simulate.apply(ABM.scala:47)
是否有任何建议可以将安全列表从 Scala 应用程序传递给 NetLogo?
我不知道 NetLogo 或其 api。但是假设它接受一个字符串并解析它,错误可能是 toString 在 scala 列表上工作的方式
在您的列表中使用 .mkString(", ")
方法,这会将 List(2015-01, 2015-02)
变成 "2015-01, 2015-02"
mkString接受的字符串是分隔符,
App.app.command("set months " + myscalalist.mkString(", "))
其他答案适用于大多数类型的值,但使用特定于 NetLogo 的 API 而不是通用的 Scala API 将适用于更多情况:
org.nlogo.api.Dump.logoObject(
org.nlogo.api.LogoList(
myscalalist.asInstanceOf[Seq[AnyRef]]: _*),
true, false)
在您的输入列表中,这将生成字符串:
["2015-01" "2015-02"]
类型转换是不幸的,但为了让它在 Scala 类型(例如List[Double]
;通常 NetLogo 期望值是 AnyRef
.
的子类型
我有一个 Scala 列表,我正在尝试将它传递给我的 NetLogo 模型:
> myscalalist
List(2015-01, 2015-02)
我正在尝试这个:
App.app.command("set months " + myscalalist)
但我在 ABM 的第 47 行收到错误 class:
Illegal number format at position 54 in
at org.nlogo.lex.Tokenizer.tokenize(Tokenizer.scala:30)
at org.nlogo.lex.Tokenizer.tokenize(Tokenizer.scala:26)
at org.nlogo.compiler.CompilerMain$.compile(CompilerMain.scala:23)
at org.nlogo.compiler.Compiler$.compileMoreCode(Compiler.scala:34)
at org.nlogo.workspace.Evaluator.org$nlogo$workspace$Evaluator$$invokeCompiler(Evaluator.scala:175)
at org.nlogo.workspace.Evaluator.evaluateCommands(Evaluator.scala:18)
at org.nlogo.workspace.AbstractWorkspaceTraits$Evaluating$class.evaluateCommands(AbstractWorkspaceScala.scala:163)
at org.nlogo.workspace.AbstractWorkspaceScala.evaluateCommands(AbstractWorkspaceScala.scala:19)
at org.nlogo.app.App.command(App.scala:849)
at main.jago.ABM$$anonfun$simulate.apply(ABM.scala:47)
是否有任何建议可以将安全列表从 Scala 应用程序传递给 NetLogo?
我不知道 NetLogo 或其 api。但是假设它接受一个字符串并解析它,错误可能是 toString 在 scala 列表上工作的方式
在您的列表中使用 .mkString(", ")
方法,这会将 List(2015-01, 2015-02)
变成 "2015-01, 2015-02"
mkString接受的字符串是分隔符,
App.app.command("set months " + myscalalist.mkString(", "))
其他答案适用于大多数类型的值,但使用特定于 NetLogo 的 API 而不是通用的 Scala API 将适用于更多情况:
org.nlogo.api.Dump.logoObject(
org.nlogo.api.LogoList(
myscalalist.asInstanceOf[Seq[AnyRef]]: _*),
true, false)
在您的输入列表中,这将生成字符串:
["2015-01" "2015-02"]
类型转换是不幸的,但为了让它在 Scala 类型(例如List[Double]
;通常 NetLogo 期望值是 AnyRef
.