更新:感谢@ rickhg12s指出看起来我可能偶然发现了一个错误。 method_exists(<, (MyType, MyType))
正在返回true
而method_exists(isless, (MyType, MyType))
正在返回false
。我在v0.3.x但是@ rickhg12s是在v0.4的每晚构建,所以我会提出一个问题。
如何检查特定类型的方法是否存在?
我以为我可以使用,例如:
method_exists(<, (Int, Int))
将返回true
,因为为两个整数定义了小于比较。但是,当我定义自己的类型时:
type MyType; end
然后尝试:
method_exists(<, (MyType, MyType))
它返回true
。但我认为它会返回false
,因为:
a = MyType()
a < a
因为<
未定义MyType
而引发错误。那么如何在运行时检测是否存在给定类型的方法?
答案 0 :(得分:6)
事实证明,method_exists
(当前)是检查特定类型是否存在方法的最佳方法,但需要非常小心。我上面的例子碰巧偶然发现朱莉娅的内部运作中有些令人困惑(但内部一致)的行为。请继续阅读,如果您仍然感兴趣的话。
@ rickhg12s在method_exists(<, (MyType, MyType))
返回true
的问题的评论中指出method_exists(isless, (MyType, MyType))
正在返回false
。
听起来像个错误吗?我提交了an issue并且julia开发者证实,观察到的行为虽然令人困惑,但在内部是一致的。
<
和isless
是两种不同的方法。重要的是,<
对于未定义<
的显式方法的情况具有默认行为。这种行为是将参数传递给isless
函数。这种行为的后果是<
被隐式定义为每个类型,甚至是刚刚创建的全新类型。因此method_exists(<, (MyType, MyType))
应该返回true
。另一方面,isless
是最低的&#34;在链中 - 没有其他功能可以将内容传递到其中,因此如果isless
未显式扩展到新类型,则Julia会在您尝试使用它时返回错误,method_exists(isless, (MyType, MyType))
将会正确返回false
。
现在已经向我指出,我可以看到这背后的逻辑。但这意味着method_exists
的用户需要小心他们将其应用于最低&#34;的功能。在链中。