如何在NetLogo 5.x中进行扩展返回值“nobody”?

时间:2015-08-05 15:57:06

标签: java netlogo

我创建了一些方法,允许我使用扩展来将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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我相信

__reload-extensions

实际上是正确的。

为什么它起初不适合你很难猜到。重建扩展后,重新启动NetLogo或使用{{1}}命令使更改生效 - 您可能还没有这样做吗?