2

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

javaApi.waitUntilPredicateIsTrue(Predicate<JavaObj> test);

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

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

你明白了。

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

4

2 回答 2

2

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

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

于 2009-04-23T14:24:10.257 回答
1

Matlab 有一个比强迫用户创建一个完整的类来提供一个方法更好的解决方案。看看他们的匿名函数

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

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

function waitForPredicate(pred)
  while pred
  end
end

waitForPredicate(@()javaApi.isMyConditionMet());
于 2009-04-23T11:37:48.003 回答