2013-11-28 64 views
1

如何通過將變量名稱傳遞給函數來更改代理程序的特定變量?如何通過將變量名稱和值傳遞給函數來更改代理的變量?

例如我有可變MONEY海龜和下面的函數:

to setVariable [varname varvalue] 
[ 
    ask one-of turtles [ set varname varvalue ] 
] 
end 

現在我想運行:

觀察者>問龜之一的[setVariable MONEY 100] ;;我需要通過另一隻烏龜詢問,因爲我無法直接在觀察者環境中使用MONEY

而且它沒有設置我的變量而沒有給出任何錯誤。

有趣的是,你可以以類似的方式讀取變量:

to showVariable [varname ] 
    [ 
     ask one-of turtles [ show varname ] 
    ] 
end 

所以這裏的問題是如何「轉換」我的功能投入龜的變量名,將認識以及對SET的目的。

PS:我不想使用運行函數,因爲它會減慢模型。 感謝您的任何建議

+0

你弄錯了有關「有趣的是,你可以閱讀以類似的方式變」的一部分;它不起作用。 –

回答

1

你是正確的run與字符串會放慢你的模型,但如果你使用run與任務,它不會。

這裏是你的setVariable程序重新編寫的使用任務:

to setVariable [setter value] 
    ask one-of turtles [ (run setter value) ] 
end 

當你調用它,調用將是這樣的:

setVariable task [ set money ? ] 100 

但是這不會,如果幫你在調用點,沒有辦法避免使用字符串。

如果必須使用字符串,它必須要快,那麼你別無選擇,只能寫出來,列出了所有的變量,你需要支持大ifelse鏈:

​​

對於閱讀變量,而不是設置,你可以放心地使用runresult包含變量名,而無需關心性能的字符串,因爲runresult緩存的編譯字符串,所以這將是快速的,因爲你會一遍又一遍地通過相同的字符串。 (設置的情況是不同的,因爲你會傳遞到run的字符串會一直有所不同。)

2

在類似的情況下,有許多可能的選項,我爲每個選項創建一個任務並將它們在查找表(使用表擴展名)和每個字符串鍵。然後我可以查找任何鍵的適當任務。它節省了嵌套的if/else結構,但我沒有調查表查找的效率。

HTH, 查爾斯

+0

是的,很好的建議。 –

相關問題