我创建了一些方法,允许我使用扩展来将turtle / breed变量作为字符串并返回值(数字,布尔值,字符串,对象(例如list / table)。但是,我想要它如果乌龟/品种不具有变量名称,则安全失败并返回“nobody”。
我无法得到任何东西将Java的null转换为NetLogo的无人,但是在NetLogo环境中,来自netlogo世界的nobody(1)和从扩展中返回的nobody(2)是相同的..即:< / p>
nobody(1)= nobody(2)是真的
部分代码:
import org.nlogo.api.*;
import org.nlogo.agent.Agent;
import org.nlogo.agent.AgentSet;
import org.nlogo.agent.Patch;
import org.nlogo.api.Nobody$;
public void load(PrimitiveManager primitiveManager) throws ExtensionException {
primitiveManager.addPrimitive("get-variable-by-name", new GetVariableByName());
}
public static class GetVariableByName extends DefaultReporter{
public String getAgentClassString() {
return "OTPL";
}
public Syntax getSyntax() {
return Syntax.reporterSyntax(
new int[] { Syntax.AgentType(), Syntax.StringType() },
Syntax.WildcardType());
}
public Object report(Argument[] args, Context arg1)
throws ExtensionException, LogoException {
Agent a = (Agent) args[0].get();
String name = (String) args[1].get();
Object value = null;
for (int i = 0; i < a.getVariableCount(); i++ ){
if (a.variableName(i).compareToIgnoreCase(name) == 0){
value = a.getVariable(i);
break;
}
}
if (value instanceof Double){
return (Double) value;
}
else if (value instanceof Boolean){
return (Boolean) value;
}
else if (value instanceof String){
return (String) value;
}
else if (value == null){
return Nobody$.MODULE$; // I've tried several things here, but none work. This the last attempt.
}
else {
return value;
}
}
}
答案 0 :(得分:1)
我相信
__reload-extensions
实际上是正确的。
为什么它起初不适合你很难猜到。重建扩展后,重新启动NetLogo或使用{{1}}命令使更改生效 - 您可能还没有这样做吗?