【问题标题】:Matlab / Java API callbackMatlab / Java API回调
【发布时间】:2009-04-23 09:35:08
【问题描述】:

我正在设计一个 API(在 Java 中)并希望用户从 Matlab 访问 API。问题是我希望 API 提供如下功能:

javaApi.waitUntilPredicateIsTrue(Predicate<JavaObj> test);

我的 API(在后台)获取 Java Obj 的实例(通过某种机制,例如 polling)。我希望此 API 方法阻塞,直到其中一个实例传递给 Predicate 计算为 true。如果我从 Java 调用这个 API,我会这样做:

javaApi.waitUntilPredicateIsTrue(new Predicate<JavaObj>() {
    public boolean evaluate(JavaObj jo) {
        return "READY".equals(jo.getState());
    }
});

你明白了。

如何在 Matlab 中调用它? 我可以使用 Matlab 中的匿名内部类吗?我可以声明一个扩展接口Predicate 的Matlab classdef(这可以处理Java 通用版本)吗?

【问题讨论】:

    标签: java matlab anonymous-class


    【解决方案1】:

    这听起来是个棘手的问题。我仍在运行 R2006b,所以这可能已经改变,但看起来 MATLAB 不会将函数句柄(包括匿名函数)和结构转换为 Java 对象。我不知道 MATLAB 自定义类,因为语法已经改变。字符串、数组和元胞数组will translate properly。他们根本不评论实现接口。 (:p :p :p 嘘嘘)

    编辑:刚刚在Matlab Central 上发现了这个页面,它谈到了一些未记录的接口。

    【讨论】:

      【解决方案2】:

      Matlab 有一个更好的解决方案,而不是强迫用户创建一个完整的类来提供一个方法。看看他们的anonymous functions

      请注意,Matlab 中的匿名函数具有奇怪的作用域规则。确保您阅读了链接帮助页面的“表达式中使用的变量”部分。如果您想要更传统的词法作用域,请查看nested functions

      编辑: 我假设您将从 Matlab 进行轮询,而不是将谓词函数传递给 Java。示例:

      function waitForPredicate(pred)
        while pred
        end
      end
      
      waitForPredicate(@()javaApi.isMyConditionMet());
      

      【讨论】:

      • 很遗憾没有;我正在尝试使我的 API 更易于用于最常见的用例和 Matlab。基本上,API 用于访问(Java)对象。但是,从用户的角度来看,对象可能还没有“准备好”。我希望提供一个简单的 waitUntilXIsReady 机制,而不是自己实现轮询逻辑。您的建议的问题是 API 上没有“isMyConditionMet”。 Matlab 最终用户需要决定他是否对它感到满意
      • 我还应该说,“轮询逻辑”比简单地在“!conditionIsMet”上旋转更复杂,在两者之间睡一会儿(尽管你可以这样做)。这是因为可以为您准备好对象的较新版本(它是通过发布到多播组的事件推出的)。我真的不希望我的 Matlab 用户搞乱原始多播!
      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 2018-05-25
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      相关资源
      最近更新 更多