是否可以在IronPython脚本中使用lambdas调用Rx扩展方法?

时间:2017-01-14 16:15:34

标签: linq system.reactive ironpython reactivex

有人可以解释一下这个非常奇怪的观察吗?

我一直试图从IronPython内部调用Rx扩展方法,结果证明这根本不可能。我把它归结为这个简单的例子:

import clr
clr.AddReference("System.Core")
from System.Linq import Enumerable

def process(value):
  return Enumerable.Select(value, lambda x:x)

在这种情况下,我们从正常的LINQ开始。如果我使用数组或任何其他process对象从我的托管环境中调用IEnumerable函数,它就可以正常工作。

然后我尝试简单地替换引用以使用Observable扩展方法,如下所示:

import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable

def process(value):
  return Observable.Select(value, lambda x:x)

在这种情况下,如果我使用process对象调用IObservable函数,则调用会因丑陋的错误消息而崩溃:

expected IObservable[object], got Select[int, int]

有没有人遇到这样的事情?我错过了什么吗?是否有一些特殊情况的黑客让EnumerableObservable缺少的import clr clr.AddReference("System.Reactive.Linq") from System.Reactive.Linq import Observable def process(value): return Observable.Sum(value) 代理一起工作?我不得不承认我在这里完全不知所措。

顺便说一下,正如一个完整性检查一样,以下示例运行得很好:

Observable.Select

我想把它留在那里只是为了清楚地表明问题确实存在于@Override public void render(float delta) { accumulator+=delta; while (accumulator>=STEP_TIME){ accumulator-=STEP_TIME; stepWorld(); } alpha = accumulator/STEP_TIME; update(delta); //RENDER using alpha } 的方法调用中。

1 个答案:

答案 0 :(得分:2)

我怀疑的部分问题是方法过载了。 IronPython运行时将尽力找到最佳使用的重载,但它偶尔会出错。您可能需要帮助消除重载的消歧。

从错误消息中,您似乎试图在IObservable<int>上调用它。似乎重载解析在这里失败并试图将其称为Observable.Select<object, object>()。您需要提供一些有关您想要使用的重载的提示。

def process(value):
    return Observable.Select[int,int](value, Func[int,int](lambda x:x))