如文档所述,当涉及局部变量(包括过程参数)时,在字符串上使用run
会遇到问题。那么,实现以下目标的推荐方法是什么?
我有参数表(p1,p2等),按名称指定全局变量的值(即,表键是字符串,对应于全局变量的名称)。给定一个名称(作为字符串)和一个参数表,我想将命名的全局变量设置为表值。例如,如果我们使用run
,如果值都是数字,我们可能会这样做:
to update [#nm #tbl]
let %tval table:get #tbl #nm
run (word "set " #nm " " %tval)
end
建议的方法是什么,避免字符串(由于文档中的警告)?
作为一个额外的复杂功能,一些表值可能是任务。
问题的延伸:
继续我10月9日的评论,我发现如果我将作业分离到一个程序,我也可以连续完成任务的全局作业。如,
to setGlobalTasks [#name #table]
;; #name : string, name of global variable
;; #table : table, maps names (strings) to values (reporter tasks)
let %tval table:get #table #name
run (word "set " #name " %tval")
end
Seth提供了一些保证,当指定的值为数字时,以这种方式继续在NetLogo中继续工作。当指定的值是任务时,这会有风险吗?它在NetLogo 5.1中是否存在任何风险?
注意:问题的这个扩展可能应该在评论中,但我无法在评论中格式化代码块。
答案 0 :(得分:1)
%tval
在双引号之外的原始方法仅适用于普通值(如数字,列表或字符串)的表值,这些值可以在往返字符串和返回后继续存在。 (如果你在练习中遇到麻烦,我的猜测是run
当你试图将它与foreach
结合时会感到困惑,就像你在http://groups.google.com/forum/#!topic/netlogo-devel/m5rnPEsxR44发布的代码一样。我相信这可以通过编写一个独立的程序来处理你的问题。)
您的修订代码,其中%tval
在双引号内,并且整个内容在单独的过程中被隔离,是正确的,并且应该适用于所有可能的表值。它应该在NetLogo 5.0和5.1中运行良好,如果有6.0,它几乎肯定在6.0中。
(在Tortoise中,它不会起作用,因为run
可能在Tortoise中根本不会支持字符串。)
正反思:
字符串上的 run
有点难看。在你想要"反思"按名称设置变量,其中名称存储在运行时计算的字符串中,如果有一个直接支持它的扩展名,那将会很好。好消息是,扩展的代码将非常简短。 NetLogo中所需的方法(扩展将调用)已经存在。坏消息是,如果您喜欢编写和编译简单的Java(或Scala)代码,那么编写任何类型的NetLogo扩展都很容易。无论如何,如果这样一个反思"扩展存在。但与此同时,你对自己拥有的东西安全。