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

    注释参数类型并不能提高性能或正确性,因此存在一些危险/反模式。它只防止为与类型断言不匹配的参数调用方法。注释参数的主要目的是控制方法分派。评论不错-谢谢。