我正在使用Dates模块,并且试图将Seconds对象转换为整数。

当我尝试以下操作时,出现错误:

x = Second(5)
Int(x)
# ERROR: MethodError: no method matching Int64(::Second)

为什么不起作用?如何将其提取为整数值?

我的问题还适用于将分钟转换为整数,将天转换为整数,将月转换为整数等。

最佳答案

为了扩展J. Blauvelt的回答,故意省略convert(Int, d)。原因是convert通常意味着等效,并且在向容器中添加元素时会自动使用push!(c, Day(5)):

julia> c = [1,2]
2-element Array{Int64,1}:
 1
 2

julia> push!(c, Second(5))
ERROR: MethodError: Cannot `convert` an object of type Second to an object of type Int64
Closest candidates are:
  convert(::Type{T<:Number}, ::T<:Number) where T<:Number at number.jl:6
  convert(::Type{T<:Number}, ::Number) where T<:Number at number.jl:7
  convert(::Type{T<:Integer}, ::Ptr) where T<:Integer at pointer.jl:23
  ...
Stacktrace:
 [1] push!(::Array{Int64,1}, ::Second) at ./array.jl:853
 [2] top-level scope at none:0

如果您允许这种自动转换,您可能会很困惑:例如,5也会将c放入Day(5) == Second(5)中,突然您处于隐含Int(t)的情况。

现在,构造函数语法convert(Int, t)t = Second(5); t.value不同。因此,原则上,也许可以允许这样做。但是从历史上看,两者是交织在一起的,并且可能有很多代码无法区分两者。

因此,当您要求与内部表示形式相关的内容时,现在最好要求用户直接利用该表示形式(例如ojit_code)。或者,以一种允许您将这些值及其单位保持在一起的方式编写代码。

10-06 00:53