6

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

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

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

4

1 回答 1

0

评论中的答案是正确的,理想情况下,您将编写ofdatetime函数,使得dt函数体内的所有操作都对 any 是通用的AbstractDateTimeDateTime在任何情况下,和之间的区别ZonedDateTime很重要,你可以你的函数中使用调度来处理细节。

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

但总的来说,最好的办法是让大多数代码对任何一种类型都通用,并且只在最后可能的时刻分派。

于 2022-01-08T03:16:54.170 回答