问题标签 [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.

0 投票
2 回答
87 浏览

c++ - 如何有效地使用dynamic_cast?

有一个抽象类Entity,其他类喜欢PlayerEnemy继承自它。当游戏检测到实体之间的碰撞时,会调用以下方法:

每个实体在与另一个实体发生碰撞时都有独特的行为,这取决于实体的类型(玩家、敌人等),这就是为什么我需要检查实体之间所有可能的组合,如上所示。但我不喜欢它创建一个巨大的 else if 链,每个实体都被检查多次的事实。还有另一种方法吗?

0 投票
1 回答
34 浏览

c++ - C++:可能与概念相关的错误产生“多次调度”

这里发生了什么?testGeneric使用参数声明的能力似乎auto&创造了一种奇怪的情况,该函数可用于实现多个调度。

使用“-fconcepts-ts”标志在 gcc 10.1 或更高版本上测试,也可以通过编译器资源管理器在 x86-64 clang(旧概念分支)上工作。

0 投票
0 回答
187 浏览

python - 是否可以在 Python 中将 functools.singledispatch 与复合/嵌套/容器类型一起使用?

我想知道是否可以实现以下目标,如果可以,不需要太多额外的代码:

并获得输出:

但是,使用 python 3.9.6 运行此代码段会导致 functools.py 的第 742 行出现错误:

singledispatch用户定义的类一样,实现这项工作的一种方法是对传递的列表中的元素进行类型检查,将传递的列表包装到一个表示 eg 的类中list[str],并让调度的函数再次调用自身,并将新实例作为参数:

正如预期的那样,结果是:

然而,除了增加可扩展性之外,首先使用singledispatch的一个原因是规避冗长的类型检查,有些人认为这是一种反模式。当然,特别是对于这个解决方案,您需要定义乱扔代码的包装类(可能有更好的方法来实现这一点,我目前还没有看到,但第一点仍然存在)。

一个原因可能是这里避免了对“列表”的一种类型检查,但这仅通过一个 if/else 子句就降低了复杂性。

所以我实际上不会使用最后一种情况。

有谁知道如何像使用非复合类型一样优雅地获得这种行为?

我想这可以使用 3.10 中的模式匹配优雅地完成。那么,如果目前不可行,也许我应该等待它的推出和成熟?

0 投票
1 回答
97 浏览

raku - 使用 nextsame 或 callame 时奇怪的“不能使用未知特征”

这是程序:

这可行,但每个例程只能应用 1 个特征,所以我考虑使用重新调度,以便可以计算和记录例程。但是,这样做:

导致一个奇怪的编译错误:

第 23 行是第一个使用AOP. 所以我有点迷失在这里。为什么添加单个语句会以这种方式改变语法?

0 投票
1 回答
213 浏览

julia - Julia:从字典或数组中解压缩参数以用于具有多个分派的函数

我的问题源于我有一个 DataFrame 值字典(带有兼容的列),我想把vcat它们放在一起。

考虑string函数如何接受任意数量的字符串参数: string("Fish ", "and ", "chips ") == "Fish and chips "(is true)。我有一本字典 myLunch = Dict(:a => "Fish ", :b => "and ", :c => "chips ") ,我想解压缩字典并将其值传递给string就好像它们是参数一样。

string( unpack(myLunch)) == "Fish and chips "

类似地,我的数据可能存储在一个数组中lunch = ["Fish ", "and ", "chips "],我想将数组的内容作为参数传递:

string( unpack(lunch) )

你怎么能这样做?

这是关于元组 StackOverflow 的相关帖子

0 投票
1 回答
58 浏览

julia - Julia 通过关键字参数的数量识别方法

我有两个具有相同名称和相同数量的“正常”参数的方法。但是,它们在关键字参数的数量上有所不同(它们都是非可选的)。

我认为以下最小示例很好地说明了我的观点:

输出的第二行(“f(带有 1 个方法的通用函数)”)已经表明 Julia 不明白我想要什么 - 它应该是2 个方法(例如,如果我写的话f(a, b; c) = a+b+c)。

我已经在 J​​ulia discourse forum 中找到了这个,这似乎解释了为什么这对多次调度不起作用。但是,在我的情况下,不是类型而是计数不同,所以我希望有一个(整洁的)解决方案。


关于我为什么想要这个:我有一个函数可以为不同的分子进行一些计算(准确地说是计算斯塔克曲线)。该函数需要针对不同的分子类型(准确地说是不同的对称性)采取不同的行动,并且还需要不同的参数(不同的量子数)。

所以这就是我需要多次调度的原因——但是为什么要使用关键字参数,你可能会问。那是因为我使用分布创建量子数并将它们NamedTuple....

我不想改变这种行为,但也许你很好奇我为什么需要这样的东西。

0 投票
1 回答
32 浏览

import - 导入的函数缺少在另一个模块中定义的方法

我有一个A描述框架的模块。然后,几个B实现框架的模块(这里只是 )。最后,我想C使用任何实现。

但是,运行以下示例:

返回错误

而且我真的不想在模块 C 中导入 B 来保证通用性。

0 投票
1 回答
89 浏览

julia - Julia 类型转换最佳实践

我有一个需要 DateTime 参数的函数。一种可能性是用户可能会提供 ZonedDateTime 参数。据我所知,有三种可能的方法可以在不中断的情况下捕获它:

  1. 在一个方法中接受两个参数,并在必要时通过 if... 语句执行类型转换
  1. 定义第二个方法,它简单地转换类型并调用第一个方法
  1. 为第二种方法重新定义整个函数体

当然,当不同的参数类型暗示函数实际上做了不同的事情时,这并不适用——多分派的全部意义——但这是一个玩具示例。我想知道在这些情况下最佳做法是什么?它不必完全与时区有关,这只是我正在使用的示例。也许一个相关的问题是“Julia 如何在后台进行多次调度?” if... else即参数是通过/块之类的东西发送给相关方法的switch... case,还是比这更聪明?

0 投票
2 回答
67 浏览

function - 在 julia 中的 slurping 运算符 (args...) 之后调度参数

你将如何实现这样的功能:

=> a = 2 , b = (3,3) , c = "最后"

我不能使用类似的东西:

因为我想在c上调度,即我想要方法:

我也不能有这样的东西:

因为我也想在 foo 上进行调度。

这有可能吗?

0 投票
0 回答
65 浏览

python - 使用 Sphinx 为分派函数创建文档

我正在使用multipledispatch包来调度一些功能。我为每个函数创建了有意义的文档字符串。代码运行良好。

但是,在使用Sphinx创建 HTML 文档时,我遇到了困难。它根本不会创建分派函数的文档。对于未调度的函数(例如add在我的示例中),文档是正确的。发出命令Sphinx时不会抛出任何错误。make html

这是我的md.rst内容:

HTML 文档

我不确定对 Sphinx 的真正期望(即结果应该如何),但help(calc)在命令行窗口中发出会显示以下内容:

如果我能通过Sphinx.