如何通过将变量名称传递给函数来更改代理的特定变量?
例如我有变量MONEY和以下函数的海龟:
to setVariable [varname varvalue]
[
ask one-of turtles [ set varname varvalue ]
]
end
现在我要跑:
观察者GT;问一只海龟[setVariable MONEY 100] ;;我需要通过另一只乌龟询问,因为我不能直接在观察者环境中使用MONEY
并且它没有设置我的变量而没有给出任何错误。
有趣的是,您可以用类似的方式读取变量:
to showVariable [varname ]
[
ask one-of turtles [ show varname ]
]
end
所以这里的问题是如何将我的函数输入“转换”为turtle的变量名,它可以很好地识别SET。
PS:我不想使用run函数,因为它会减慢模型的速度。 感谢您的任何建议
答案 0 :(得分:2)
在类似的情况下,有许多可能的选项,我为每个选项创建一个任务,并将它们放在查找表中(使用表扩展名),每个查询表都有一个字符串键。然后我可以为任何键查找适当的任务。它节省了嵌套的if / else结构,但我还没有调查表查找的效率。
HTH, 查尔斯
答案 1 :(得分:1)
你是正确的run
字符串会降低你的模型速度,但如果你对run
使用任务,那就不会。
以下是您使用任务重写的setVariable
程序:
to setVariable [setter value]
ask one-of turtles [ (run setter value) ]
end
当您拨打电话时,呼叫将如下所示:
setVariable task [ set money ? ] 100
但如果在通话网站上没有办法避免使用字符串,这对你没有帮助。
如果你必须使用字符串,它必须很快,那么你别无选择,只能写出一个列出你需要支持的所有变量的大型ifelse链:
to setVariable [varname varvalue]
ask one-of turtles [
ifelse varname = "money"
[ set money varvalue ]
[ ifelse varname = "food"
[ set food varvalue ]
...
]
end
对于读取变量而不是设置,您可以安全地将runresult
与包含变量名称的字符串一起使用而无需关注性能,因为runresult
缓存已编译的字符串,因此它将是快,因为你将一遍又一遍地传递相同的字符串。 (设置案例不同,因为您传递给run
的字符串会一直不同。)