gpt4 book ai didi

linq - 是否可以从 IronPython 脚本中使用 lambda 调用 Rx 扩展方法?

转载 作者:行者123 更新时间:2023-12-04 15:40:50 26 4
gpt4 key购买 nike

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

我一直在尝试从 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 的 lambda 代表一起工作不见了?我不得不承认我在这里完全感到困惑。

顺便说一句,作为健全性检查,以下示例可以正常工作:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable

def process(value):
return Observable.Sum(value)

我想把它留在那里只是为了清楚地表明问题确实出在对 Observable.Select 的方法调用中。 .

最佳答案

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

从错误消息来看,您似乎正试图在 IObservable<int> 上调用它.似乎重载解决方案在这里失败,并试图将其称为 Observable.Select<object, object>() .您需要提供一些提示来说明要使用的重载。

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

关于linq - 是否可以从 IronPython 脚本中使用 lambda 调用 Rx 扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41652150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com