Julia 类型转换最佳实践

eag*_*tom 6 conventions multiple-dispatch julia

我有一个需要 DateTime 参数的函数。一种可能性是用户可能提供 ZonedDateTime 参数。据我所知,有三种可能的方法可以在不破坏的情况下捕获此问题:

  1. 在单个方法中接受两个参数,并在必要时通过 if... 语句执行类型转换
function ofdatetime(dt::AbstractDateTime)
    if dt::ZonedDateTime
        dt = DateTime(dt, UTC)
    end 
    ...
end
Run Code Online (Sandbox Code Playgroud)
  1. 定义第二个方法,它简单地转换类型并调用第一个方法
function ofdatetime(dt::DateTime)
    ...
end
    
function ofdatetime(dt::ZonedDateTime)
    dt = DateTime(dt, UTC)
    return ofdatetime(dt)
end
Run Code Online (Sandbox Code Playgroud)
  1. 为第二种方法重新定义整个函数体
function ofdatetime(dt::DateTime)
    ...
end
    
function ofdatetime(dt::ZonedDateTime)
    dt = DateTime(dt, UTC)
    ...
end
Run Code Online (Sandbox Code Playgroud)

当然,当不同的参数类型意味着该函数实际上执行不同的操作(多重分派的全部意义)时,这并不适用,但这只是一个玩具示例。我想知道这些情况下的最佳做法是什么?它不必专门与时区有关,这只是我正在使用的示例。也许一个相关的问题是“Julia 如何在幕后进行多次调度?” if... else即参数是通过/块之类的东西分派给相关方法的switch... case,还是比这更聪明?

cbk*_*cbk 0

注释中的答案是正确的,理想情况下,您编写的ofdatetime函数应使dt函数体内的所有操作都通用于任何AbstractDateTimeDateTime在任何情况下,和之间的差异ZonedDateTime很重要,您可以在函数中的该点使用调度来处理细节。

如果做不到这一点,在您的问题中,通常23可取,因为对于其中任何一个,如果在编译时已知1类型,则可以省略分支。df在后两者中,就一般代码风格(“DRY”)而言,2可能比3您的示例中编写的更可取,但是如果您能够通过编写完全不同的函数体来避免类型转换,那么实际上3可能比您的示例具有更好的性能如果类型转换非常昂贵。

但总的来说,最好的方法是让大多数代码对任一类型保持通用,并且仅在最后可能的时刻分派。