glo*_*pes 6 linq ironpython system.reactive reactivex
有人可以解释一下这个非常奇怪的观察吗?
我一直试图从IronPython内部调用Rx扩展方法,结果证明它根本不可能.我把它归结为这个简单的例子:
import clr
clr.AddReference("System.Core")
from System.Linq import Enumerable
def process(value):
return Enumerable.Select(value, lambda x:x)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们从正常的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)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我process用一个IObservable对象调用该函数,则调用崩溃时会出现一条丑陋的错误消息:
expected IObservable[object], got Select[int, int]
有没有人遇到这样的事情?我错过了什么吗?是否有一些特殊情况黑客可以使缺少的Enumerablelambda代理工作Observable?我不得不承认我在这里完全不知所措.
顺便说一句,正如一个完整性检查,以下示例正常工作:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable
def process(value):
return Observable.Sum(value)
Run Code Online (Sandbox Code Playgroud)
我想把它留在那里只是为了清楚问题确实在方法调用中Observable.Select.
我怀疑部分问题是方法超载。IronPython 运行时将尽力找到最佳的重载来使用,但偶尔也会出错。您可能需要帮助消除重载的歧义。
从错误消息来看,您似乎正在尝试在IObservable<int>. 似乎重载解析在这里失败并试图将其称为Observable.Select<object, object>(). 您需要提供一些关于您想要使用的重载的提示。
def process(value):
return Observable.Select[int,int](value, Func[int,int](lambda x:x))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |