我正在使用Dates模块,并且试图将Seconds对象转换为整数。
当我尝试以下操作时,出现错误:
x = Second(5)
Int(x)
# ERROR: MethodError: no method matching Int64(::Second)
为什么这行不通?如何将其提取为整数值?
我的问题还适用于将分钟转换为整数,将天转换为整数,将月转换为整数等。
答案 0 :(得分:3)
为扩展J. Blauvelt的回答,有意省略*
。原因是str.split
通常意味着等价,并且在向容器中添加元素时会自动使用 :
convert(Int, d)
如果您允许这种自动转换,您可能会感到很困惑:例如,convert
还将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
放入push!(c, Day(5))
中,突然之间您处于您已经暗示5
。
现在,构造函数语法c
与Day(5) == Second(5)
不同。因此,原则上,也许可以允许这样做。但是从历史上看,两者是交织在一起的,并且可能有很多代码无法区分两者。
因此,当您要求与内部表示形式相关的内容时,现在最好要求用户直接利用该表示形式(例如Int(t)
)。或者,以一种使您可以将这些值及其单位保持不变的方式编写代码。
答案 1 :(得分:2)
访问第二个对象的.value属性,而不是使用Int构造函数:
x = Second(5)
x.value # 5
这适用于“日期”模块中的其他对象,例如Minute
,Day
,Month
等。
也请查看@tholy的答案,以很好地解释其为何如此结构。
作为旁注,dump()
在这种情况下非常有用-当您使用陌生的对象并且您想了解如何访问其属性时,等等:
dump(x)
# Output:
# Second
# value: Int64 5