我正在使用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)。或者,以一种允许您将这些值及其单位保持在一起的方式编写代码。