问题标签 [method-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.
swift - 在运行时,Swift 如何知道要使用哪个实现?
如果这是一个继承层次结构,我希望 Swift 使用 v-table 来查找正确的实现。但是,其中的具体类型array
可以是任何实现A
的,以及任何数量的其他协议,那么如果 Swift 运行时也使用 v-tables,它如何知道对象的结构呢?
java - 具有超类和子类签名的 Java 2 函数 - 尽管子类的类型是子类,但仍选择超类
我有以下代码:
据我所知,equals
方法选择应该以这种方式工作:在编译时将选择签名,并且由于s
是编译时类型(例如),因此应该选择type
带有参数的方法,并且因为是then的一个实例我们将进入我们的实现而不是's。String
b1
Main
Main
equals
Object
但是,在调试时,我看到我Main
使用 type 参数输入了实现Object
。
我看到了那 2 篇文章:
基于参数的真实类型的重载方法选择- 没有解释我的情况,而是类型为s
Object 的情况。
https://stackoverflow.com/a/8356435/4345843 - 据我所知,这个答案如果属实,支持我的理论。
很高兴得到解释。
r - NextMethod() 显式参数性能
使用 S3 对象系统,在通用方法中,您可以使用函数委托给类层次结构中的下一个方法NextMethod()
。当 Wickham 在http://adv-r.had.co.nz/S3.html描述这个系统时,他NextMethod()
在他的例子中没有任何参数地使用:
我也一直NextMethod()
在自己的代码中使用不带参数的方法。
我刚刚注意到它[.Date
使用了一个明确的论点:
的文档?NextMethod
说明如下:
通常“NextMethod”只与一个参数“generic”一起使用
就性能而言,调用NextMethod("generic")
速度是否比NextMethod()
? 还有其他理由更喜欢一种用法而不是另一种吗?
performance - 在 Julia 中的不同函数中添加函数方法的最佳/最高性能方法
在我的问题中,我有一个函数,say optim
,它的参数之一是另一个函数,sayobjfunc
以及其他一些参数:
optim(objfunc, args...)
我希望在另一个函数中调用这个函数,让我们调用它run_expt
,并传递一个objfunc
我设置为其他函数的特定方法的值myfunc
。
所以具体来说,假设 ifmyfunc
接受了四个参数:
myfunc(a, b, c, d)
我想要一个特定的方法让它传递给optim
,它固定了它的一些参数的值:
mymethod(a) = myfunc(a, [1, 2, 3], (12.0, 47), false)
并且这些值是在函数run_expt
中以一种事先不知道的方式确定的。实现这一点的最佳方法是什么,特别是如果该方法mymethod
在被调用时是高性能的,optim
因为它会被多次调用。
我可以看到两种可能的方法,我想知道是否有一种出于某种风格或性能原因是首选的,或者是否 - 更有可能 - 完全有更好的方法。
方法 #1嵌套函数:
方法 #2使用另一个返回方法的函数:
这两种方法有明显的优点/缺点还是有更好的方法?
r - 在 R 中创建具有不同参数的函数
我正在创建一个执行类似行为的函数,但它会调用不同的预测算法。
将其保留为单独的函数并单独调用它或使用“UseMethod”创建通用函数是最佳实践吗?我尝试使用“UseMthod”创建
这个想法是将这些函数称为预测函数中的模型构建块
基于 'algo_name' 的值(可以是字符串或函数名ets
, auto.arima
),'modelBuild' 调度正确的方法。
r - 在 R 中用不同的参数重载 S3 函数
这是对已发布问题的后续行动Create a function with different arguments in R
我创建了一个通用函数,但遇到了将不同的参数集传递给这些函数的问题
现在,我想添加一个model
参数modeBuild.ets
和一个不同的参数nnetar
该modelBuild
函数被另一个函数调用
现在,我们测试一个可重现的例子
结果nnetar
错误
为了更正它,我将所有参数作为输入包含在每个modelBuild
现在,所有功能都按预期工作
这是在其中创建泛型函数的最佳实践,R
还是有一种方法可以定义具有有限参数的方法,每个methodBuild
方法仍然可以调用它,而无需定义特定函数不需要的参数。我正在寻找类似的重载函数行为,如java
这可以在S4
或R6
方法系统中解决吗?
swift - 将 Swift 类标记为 final 是否也会使所有包含的 var、let 和函数自动获得静态调度的好处?
我试图从我的应用程序中挤出最后一点性能。我尽可能在类上使用结构(无状态共享、默认直接调度等)。但是我的视图控制器和 UIView 对象显然仍然是类。出于性能原因,我想对我的每一个方法和数据成员 强制直接调度。
我是否还需要在我的类final中标记每个var、let和func,或者仅仅标记托管类 final 就足够了,以便它下面的所有东西都可以利用直接方法调度?
换句话说:在每个方法和变量之前粘贴 final 是非常乏味的。所以我希望将它放在类本身上具有强制直接调度所有类成员的相同效果。但我不知道如何测试或验证它。
对于那些想知道我在说什么的人,请查看这篇文章:“Swift 中的方法调度”。默认情况下,结构和协议扩展为您提供静态方法调度(最快的性能),但类没有。类中的静态方法可以,但我想对所有实例方法和数据成员强制静态调度。
https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/
swift 语言运行时文档提到了对子类化能力的影响,但没有描述子成员的调度行为和标记为“最终”的类的函数会发生什么。如果下面的所有内容都获得了静态方法调度,而不必单独标记所有内容,那就太好了。
最终的
将此修饰符应用于类或类的属性、方法或下标成员。它应用于一个类以指示该类不能被子类化。它应用于类的属性、方法或下标,以指示不能在任何子类中覆盖类成员。有关如何使用 final 属性的示例,请参阅防止覆盖。
r - 为 R6 类向量实现方法分派
是否有关于如何将 R6 对象向量的方法分派到数据框或列表中的指导?
这适用于单个 R6 类
按照建议在另一个线程中实现 S3 方法分派对于单个 R6 对象非常有效,例如:
但是应该如何实现以下内容:
返回的数据框应为每个 R6 对象和字段名称提供一行,应用作列名称,其值在每一行中
generics - 如何在 cl-defmethod 中添加新的专门工具,以应用于多个主要模式?
如何扩展 acl-defmethod
以匹配多个major-mode
s?cl-generic 中有一些文档,但我不明白泛化器宏发生了什么。
举个例子,
我只想在and(my-gen-fun arg)
中打印“c-” ,而不是其他 cc 派生模式,如or 。如何添加新的专家来处理这种情况?c-mode
c++-mode
java-mode
awk-mode
r - 使用 S4 方法分派 S3 方法
我在理解 S3 和 S4 类之间方法分派的差异时遇到了一些麻烦。据我了解,S3 类通过传递的对象UseMethod
的属性使用并找到正确的方法。class
S4 类使用StandardGeneric
和处理函数签名(我正在阅读Advanced R)。但是下面的代码运行:
这里到底发生了什么?我创建了一个名为“myfun”的 S3 方法,S3 方法分派按预期工作。到目前为止,一切都很好。
但是这个 S3 方法也正确地分派了 S4 方法,即使我没有为这些 S4 方法定义 StandardGeneric(或将 myfun 转换为此类方法)。怎么来的?任何背景将不胜感激。
提前致谢!