Julia类型转换的最佳实践



我有一个函数,它需要一个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

当然,当不同的参数类型意味着函数实际上做了不同的事情时,这并不适用——这是多重调度的全部意义——但这是一个玩具般的例子。我想知道在这种情况下最好的做法是什么?它不必只与时区有关,这只是我正在使用的示例。也许一个相关的问题是"朱莉娅是如何在幕后进行多重调度的?"即,参数是由if... else/switch... case块之类的东西发送到相关方法的,还是比这更聪明?

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

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

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

最新更新