Джулия конвертирует секунды в целое число из пакета Dates: метод не соответствует Int64 (:: Second) - PullRequest
2 голосов
/ 21 мая 2019

Я использую модуль Dates и пытаюсь преобразовать объект Seconds в целое число.

Когда я пытаюсь сделать следующее, я получаю сообщение об ошибке:

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

Почему это не работает? Как мне просто извлечь это как целочисленное значение?

Мой вопрос также относится к преобразованию минут в целое число, дней в целое число, месяцев в целое число и т. Д.

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Чтобы расширить ответ от J. Blauvelt, упущение 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) отличается от convert(Int, t). Так что в принципе, возможно, это могло быть разрешено. Но исторически эти два были переплетены, и может быть значительное количество кода, который не различает два.

Следовательно, когда вы запрашиваете что-то, связанное с внутренним представлением , сейчас кажется, что лучше потребовать, чтобы пользователь использовал это представление напрямую (например, t = Second(5); t.value). Или напишите свой код так, чтобы вы могли хранить эти значения вместе с их единицами.

2 голосов
/ 21 мая 2019

Вместо использования конструктора Int, получите доступ к свойству .value второго объекта:

x = Second(5)
x.value # 5

Это работает для других объектов из модуля Dates, таких как Minute, Day, Month и т. Д.

Проверьте также ответ @ tholy, чтобы получить отличное объяснение, почему он так структурирован.

В качестве примечания, dump() - полезная функция в подобных ситуациях.- когда вы работаете с незнакомым объектом и хотите понять, как получить доступ к его атрибутам и т. д .:

dump(x)
# Output:
# Second
#  value: Int64 5
...