2013-11-28 8 views
1

변수 이름을 함수에 전달하여 에이전트의 특정 변수를 변경하는 방법은 무엇입니까?변수 이름과 값을 함수에 전달하여 에이전트의 변수를 변경하는 방법은 무엇입니까?

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

는 지금 실행할 :

예를 들어 나는 변수 돈 거북이 다음과 같은 기능이

관찰자> 거북이 한 부탁 [은 SetVariable 돈 100]; 관찰자 컨텍스트에서 MONEY를 직접 사용할 수 없기 때문에 다른 거북이를 통해 질문해야합니다.

그리고 오류없이 내 변수를 설정하지 않습니다.

흥미롭게도, 당신은 유사한 방식으로 변수를 읽을 수 있습니다

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

그래서 여기에 질문은 거북이의 변수 이름은 SET 목적을 잘 인식 할 것이다에 내 기능 입력을 "변환"하는 방법입니다.

추신 : 나는 모델을 감속시키기 때문에 실행 기능을 사용하고 싶지 않습니다. 제안 해 주셔서 감사합니다.

+0

부분 "흥미롭게도 비슷한 방식으로 변수를 읽을 수"에 대해 당신은 착각; 작동하지 않습니다. –

답변

1

문자열이있는 run은 모델 속도를 저하시키지 만 작업이있는 경우 run을 사용하면 올바르지 않습니다. 당신이 그것을 호출 할 때

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

통화가 다음과 같이 표시됩니다 : 여기

setVariable 절차는 작업을 사용하여 다시 것

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로 전달할 문자열이 항상 달라지기 때문에 설정 사례가 달라집니다.)

2

비슷한 상황에서 가능한 옵션이 여러 개있는 경우 각각에 대해 작업을 만들어 놓습니다 조회 테이블 (테이블 확장 사용)에 각각에 대한 문자열 키가 있습니다. 그런 다음 어떤 키에 대해서도 적절한 작업을 조회 할 수 있습니다. 중첩 된 if/else 구조를 저장하지만 테이블 조회 효율을 조사하지 않았습니다.

HTH, 찰스

+0

네, 좋은 제안입니다. –

관련 문제