Julia函数命名

Julia是有多分派的,所以一般不用为一种函数名称为某个特定类型添加后缀,比如

op_mytype(....)

那,定义函数时是让Julia找到函数名即找到该函数,还是多多利用多分派呢?为特定类型添加名称后缀是不是多此一举?

Images.jl 里面大概的思路是:

  • 直接用多分派
  • 在实现比较复杂(方法太多的情况下),将具体的实现细节用_另起一个名字

例如 colorview 的实现定义在_colorview,然后colorview只负责API的分派

目前看下来大部分的Julia代码都是这样写的,因为可以避免手动维护一个分派列表:

# 这种写法在MATLAB或者Python里很常见,但是在Julia下不需要这样做
function foo(args...)
    if call_method_1(args...)
        foo1(args...)
    elseif call_method_2(args...)
        foo2(args...)
    else
        error("unrecognized argument")
    end
end

function foo1(...)
...
end

function foo2(...)
...
end
1 个赞

不错,既然Julia提供了多分派就尽量用多分派,一般项目不会因为查表而产生多大的性能影响。

为了让分派不容易产生歧义,一般会构造一个结构体:

abstract type AbstractMyAlgorithm end

struct Alg1 <: AbstractMyAlgorithm
     arg1
     arg2
     arg3
end
struct Alg2 <: AbstractMyAlgorithm
    arg4
    arg5
end

function foo(alg::Alg1, args...)
...
end

function foo(alg::Alg2, args...)
...
end
1 个赞

实际上 Julia 对这个优化已经做到几乎没有overhead了,整个Base里的函数都充斥着这种写法

1 个赞