Julia 自动创建多个方法
我可以定义一个处理Julia 自动创建多个方法,julia,Julia,我可以定义一个处理整数的函数: function twice(a::Int64) a + a end 此函数无法处理Floats。如果需要,我需要定义另一种方法: function twice(a::Float64) a + a end 但是等等,除了类型定义之外,这看起来完全一样。所以,当我晚上做梦的时候,有可能用一个。。。也许吧?差不多 @create_all_methods ("twice(a::$type ) a + a end", ["Int64", "Float64"]) 这可
整数的函数
:
function twice(a::Int64) a + a end
此函数无法处理Float
s。如果需要,我需要定义另一种方法:
function twice(a::Float64) a + a end
但是等等,除了类型定义之外,这看起来完全一样。所以,当我晚上做梦的时候,有可能用一个。。。也许吧?差不多
@create_all_methods ("twice(a::$type ) a + a end", ["Int64", "Float64"])
这可能吗?如果可能,如何实现
这个问题可能毫无意义,因为在任何情况下,函数两次(a)a+a结束
都不会实现完全相同的结果
提前感谢您的帮助。为两种或两种以上输入类型创建方法的简单方法是使用Union
:
twice(a::Union{T1, T2, T3}) = a + a
其中T1
,T2
,T3
,等等。是具体类型,例如Int
或Float64
更常见的情况是,您可以为某些抽象超类型定义它,例如
twice(a::Number) = a + a
但大多数时候,您应该从定义泛型函数开始
twice(a) = a + a
然后在发现有必要时添加类型。大多数情况下并非如此。实现这一点有多种方法。最简单的方法是省略a
T的类型,然后您的方法如下所示:
function twice(a) a + a end
这相当于
function twice(a::Any) a + a end
但是,可能您不想为所有类型定义它,或者您已经为定义了两次(a::Any)
,因此您可以将定义限制为Int64
和Float64
的公共超类型。这个常见的超类型可以通过typejoin(Float64,Int64)
找到,并生成结果Real
,因此您的定义现在是
function twice(a::Real) a + a end
这还为Real
的其他子类型(如a::Int32
)创建了一个方法,因此,如果您确实希望该方法仅用于Int64
和Float64
,则可以创建联合类型。那么这个方法看起来像
function twice(a::Union{Int64, Float64}) a + a end
for T in (Int64, Float64)
@eval function twice(a::$T) a + a end
end
最后,使用宏确实可以实现您想要实现的目标。在这种情况下没有意义,但在更复杂的情况下,通常使用函数eval
或宏@eval
。您的代码可能看起来像
function twice(a::Union{Int64, Float64}) a + a end
for T in (Int64, Float64)
@eval function twice(a::$T) a + a end
end
如果您刚刚开始学习Julia,我不建议您使用eval
,因为使用eval
注释参数类型并不能提高性能或正确性,因此存在一些危险/反模式。它只防止为与类型断言不匹配的参数调用方法。注释参数的主要目的是控制方法分派。评论不错-谢谢。