有人可以解释一下这个非常奇怪的观察吗?
我一直试图从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]
有没有人遇到这样的事情?我错过了什么吗?是否有一些特殊情况的黑客让Enumerable
与Observable
缺少的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
}
的方法调用中。
答案 0 :(得分:2)
我怀疑的部分问题是方法过载了。 IronPython运行时将尽力找到最佳使用的重载,但它偶尔会出错。您可能需要帮助消除重载的消歧。
从错误消息中,您似乎试图在IObservable<int>
上调用它。似乎重载解析在这里失败并试图将其称为Observable.Select<object, object>()
。您需要提供一些有关您想要使用的重载的提示。
def process(value):
return Observable.Select[int,int](value, Func[int,int](lambda x:x))