问题标签 [multiple-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
roles - 对象、角色和多重分派
我正在尝试使用多个调度来重载和使用组合类中的方法。这是实现:
但是,这失败了:
(我真的不知道为什么 callameStr
用作签名)。更改method bar
使用callwith
:
根本不起作用:
call*
在角色/类中是否有任何特殊的工作方式?
python - 在python中进行多次调度的简单方法?(没有外部库或类构建?)
我正在编写一个一次性脚本来计算一些我正在运行的模拟的分析解决方案。
我想以一种根据其输入计算正确答案的方式实现一个函数。例如,假设我有以下数学方程式:
对我来说似乎很简单,我应该能够执行以下操作:
我可能已经习惯了在 中写作julia
,但我真的不想让这个脚本过于复杂。
julia - 是否可以在 NOT-a-type 上进行多次调度?
为了简化,我正在尝试编写一个带有两个参数的函数,其中:
基本方法接受两个整数作为参数
func(x::Int, y::Int) = 某事
其他方法接受一个或两个参数作为任意类型,将这些参数映射到整数,并调用基本方法
- 其他方法接受一个或两个参数作为数组(或 ::Colon 类型),并通过应用适当的先前方法 (1) 或 (2) 逐元素生成数组。
不出所料(事后看来),这种方法会产生方法歧义。鉴于提供给函数的参数类型,Julia 会选择具有最具体类型的有效方法。但是如果 x 是一个数组并且 y 是一个 Int,那么以下方法同样是特定的,而 Julia 不知道该调用哪一个:
- func(x::Any, y::Int)
- func(x::Array, y::Any)
我想做类似的事情
- func(x::T, y::Int) T <: any_so_long_as_not_array = func(map_x_to_Int(x), y)
- func(x::Array, y::Any) = (el -> func(el, y)).(x)
有没有非类型类型之类的东西?我在想这个错误的方式吗?有没有解决这类问题的规范方法?
对于上下文,我正在尝试为我编写的结构实现 Base.getindex,并且当结构的内容可能有所不同时,我希望 getindex 支持多种不同的方式来索引结构。在幕后,结构中的元素由整数索引,但用户可能使用几乎任意的非整数类型来索引结构中的元素(我不想强迫用户使用特定类型来索引元素)。
polymorphism - 指定 Julia 函数只能采用其内容为特定类型的字典/数组的正确方法是什么?
假设我有一个函数需要一个 dict 作为输入。在此范围内,此函数只能处理特定Union
允许类型中的该 dict 的值。对于此参数,输入可以是Number
、String
或Bool
:
该函数还可以允许其值是这些允许的类型 ( Dict{String,allowed_types}
) 的字典或项目是这些类型 ( ) 的数组,Array{allowed_types,Int}
因为它们可以“反汇编”为这些允许的类型之一。(这可以继续向下 - 所以数组数组等)
然后我可以将我的功能定义为
那么,我如何构建我的函数参数以便我可以传递,IE my_func(Dict("a"=>"astr","b"=>1))
,?通常,该Dict(...)
调用会导致 a Dict{String,Any}
,它不能与我的函数一起调用,因为Any
它不是允许的类型。
我当前实现的错误是:
我从用户的角度来描绘这个问题,用户可能只是使用默认构造函数创建一个 dict,而不考虑my_func
想要“允许”什么(这意味着我不希望他们调用Dict{String,my_pkg.full_allowed_types}(...)
)。
如果在我遍历输入时任何元素不符合我允许的类型,那么最好的选择是只允许Any
作为输入然后抛出错误吗?my_func
function - 如何从另一个函数中将关键字参数传递给“范围”函数并保持 Julia 的用户灵活性?
我正在 Julia 中编写我的第一个模块。我有一个函数f
将使用向量或范围进行某些计算。我想创建一个此函数的方法,该方法将range
在继续计算之前使用该函数创建一个范围,以便为用户提供一些灵活性。
我写了以下内容:
但是,range
将只接受step
或之一length
。除非双方达成一致,否则不能两者兼得。这导致我想要定义另一个g
将在f
. g
会调用range
并有方法来解释三种可能的情况。
- 用户
length
在调用时指定f
。 - 用户
step
在调用时指定f
。 - 用户在调用时既不指定
length
也不指定,因此使用默认值。step
f
step
我宁愿不创建更多的方法f
来避免#do more stuff with x and r
过度复制。我还想if
尽可能避免声明以利用多次调度并提高效率。虽然,到目前为止,我还没有提出任何解决方案。
我不能g
用关键字参数定义多个方法,因为关键字参数是可选的。
我也无法将关键字参数转换为常规参数,因为我不知道要传递哪个参数。
c++ - 使用参数包自动化 dynamic_cast 检查
我正在尝试在 GUI 内实现通信系统。出于可维护性的原因,我想避免访问者模式。同样,如果 else 语句不可维护,则制作 dynamic_cast。我最接近的方法是使用 Scott Meyers 的 More Effective C++ 中的表实现多个调度。
到目前为止,我有:
我想去的地方是:
其中 dispatch 是一种自动检查传入命令的 dynamic_cast 结果的方法。
在这种情况下,将在编译时检查特定模块,以确保它对模板中的每个参数都有一个函数。代码块 2 可能吗?
c++ - 访问者模式是否比受控使用 RTTI 更好?
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我想要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下,我想发出一个访问者并让所有监听类接收访问者并执行操作。接口如下所示:
同样,如果我想要多个命令,我需要让多个访问者:
对我来说,这似乎违反了打开/关闭原则,因为每次我想连接一个新的监听器或实现一个新的访问者时,我总是不得不返回更新我的接口。理想情况下,这将使用双重分派,并且如果没有专门的接口存在,则能够使基类保持不变,仅根据他们使用基类接口接受的访问者来更改派生类。我知道这在 C++ 中是不可能的,因为函数重载和参数类型基于编译时信息。
一般来说,这都是关于在不支持它的程序中重新实现多个调度。
我看过很多关于访问者模式的争论,这似乎是人们使用和讨厌的模式。它似乎是它的访问者模式或dynamic_cast?我已经实现了一个模板化的帮助类,它可以在使用 dynamic_cast 以实现更好的维护时自动执行可怕的 if-else 逻辑。所以我的问题是......当逻辑维护在很大程度上自动化时,使用 dynamic_cast 的陷阱是否比访问者模式中提到的陷阱更糟糕?
编辑:
std::visit 确实似乎是解决多分派问题的好方法。我能够使用以下一个衬垫创建一个简单的消息传递系统:
c - 根据 OpenWatcom C 语言中的参数类型检测调用哪个函数
根据参数中的指针大小,我有 2 个相同函数的实现:
我想自动选择调用哪个,所以我写了一个宏:
但是,如果使用远指针调用它,wcc 会为未调用的分支发出警告:
我也尝试过C11 _Generic,但 wcc 似乎不支持它:
我收到此警告,然后出现错误:
如何在 C(不是 C++)中,在 Open Watcom V2 中使用 wcc,在小内存模型(-ms
)中使其在没有警告的情况下工作?
julia - Julia 中函数的抽象类型和多次调度
我想让对象根据它们的类型与特定的交互进行交互。
示例问题:我有四个粒子,两个是A型,两个是B型。当A型交互时我想使用该功能
当 B 型交互时我想使用该功能
当 A 型与 BI 型交互时要使用函数
这些功能故意过于简单。
我想计算一个依赖于成对交互的简单总和:
假设使用参数particle[1].parm = -1
, particle[2].parm = 3
, particle[3].parm = 4
, particle[4].parm = 1.5
, 能量应该解释
这样做if statements
几乎是微不足道的,但不可扩展。我追求干净、整洁的 Julia 方法......