首页 > 解决方案 > 在 Netlogo 中将字符串转换为变量名

问题描述

set我试图使用该命令更新一堆全局变量。

全局变量是不同字符串的组合。

例如,我有 6 个全局变量,称为:

a_x, b_x, c_x, a_y, b_y, c_y

我想使用foreach命令将所有六个全局变量的值更新为 1。

下面是我的代码:

let a_x 0
let b_x 0
let c_x 0
let a_y 0
let b_y 0
let c_y 0

let first_list (list "a" "b" "c")
let second_list (list "x" "y")

foreach first_list [
   [i] -> 
   foreach second_list [
     [j] -> 
   set (word i "_" j) 1
 ]
]

我收到“这不是您可以使用“设置”打开的东西”错误消息。

我想我可能需要将字符串(word i "_" j)转换为变量名,以便 Netlogo 可以通过set命令对其进行更新。

有什么方法可以将字符串转换为foreachNetlogo 循环中的变量名?

标签: stringvariablesforeachsetnetlogo

解决方案


您可以在字符串上使用run来执行从字符串构建的 NetLogo 代码。您可以将其用于set全局变量。word您可以构造整个set a_x 1语句,然后再构造整个语句,而不是只构造变量名run

let但是,由于run与字符串值一起使用时处理范围的方式,这不适用于局部变量。

所以这里是你的样本更新了全局变量,这将起作用:

globals [
  a_x
  b_x 
  c_x
  a_y
  b_y
  c_y
]

to test
  clear-globals ; reset to `0`
  
  let first_list (list "a" "b" "c")
  let second_list (list "x" "y")

  foreach first_list [
    [i] -> foreach second_list [
      [j] -> run (word "set " i "_" j " " 1)
    ]
  ]
  
  show a_x ; outputs `1`
end

编辑以添加第二个选项。

您也可以使用扩展table来存储值。它可以使用字符串作为键(你的变量名),并存储你喜欢的任何值。根据您的用例,这可能总体上更容易/更简单。


推荐阅读