一个非常基本的问题,我看不到为什么我的foreach代码什么都不做(没有错误消息但没有任何效果)。因此,我的海龟有一个3维变量(意图),其预设为[0 0 0]
。我的最后一个问题要比这复杂得多,但是用简单的术语来说,我现在正试图使此向量的每个维度更改为一个维度,即[1 1 1]
。
我创建了一个名为change-intention
的过程,该过程使用foreach
来产生该过程,但无效:
to change-intention
ask turtles [
(foreach intention [ x -> set x 1])
]
end
我已经在观察者和乌龟命令行以及单个乌龟上尝试了此操作,没有结果也没有错误。
谢谢!
答案 0 :(得分:3)
几个问题。首先是列表是不可变的-如果要更改列表中的值,则必须使用该值创建一个新列表。第二个是您不能使用set
来执行此操作,而必须使用replace-item
。
代码是独立的-打开一个新模型并尝试一下,将testme过程中的调用更改为不同的实现。过程change-intention1是您当前正在考虑的过程(无论如何,我的解释)。更改解释过程2是实现您的方法,替换每个项目并创建新列表(解决已发现的问题)的方法。
但是,执行此操作的更好方法是使用map
过程而不是foreach
,因为所有值都立即更改,而不是遍历列表并处理每个值。当然,在您的实际模型中实现起来可能并不容易。
turtles-own [intention]
to testme
clear-all
create-turtles 1
[ set intention [0 0 0]
]
ask turtles [ type "before call:" print intention ]
change-intention2
ask turtles [ type "after call:" print intention ]
reset-ticks
end
to change-intention1
ask turtles
[ foreach intention
[ x ->
print "here"
set intention 1
]
]
end
to change-intention2
ask turtles
[ foreach intention
[ x ->
let pp position x intention
type "here:" print pp
set intention replace-item pp intention 1
]
]
end
to change-intention3
ask turtles
[ set intention map [ x -> 1 ] intention
]
end