Я перечитываю Документацию по языку Julia, представляющую интерес для создания приложения с производственной звуковой очередью, и раздел, касающийся конструкторов c параметров и внешних конструкторов, запутал меня. Пример, который они показывают, выглядит следующим образом:
julia> struct OurRational{T<:Integer} <: Real
num::T
den::T
function OurRational{T}(num::T, den::T) where T<:Integer
if num == 0 && den == 0
error("invalid rational: 0//0")
end
g = gcd(den, num)
num = div(num, g)
den = div(den, g)
new(num, den)
end
end
julia> OurRational(n::T, d::T) where {T<:Integer} = OurRational{T}(n,d)
OurRational
julia> OurRational(n::Integer, d::Integer) = OurRational(promote(n,d)...)
OurRational
julia> OurRational(n::Integer) = OurRational(n,one(n))
OurRational
В документации говорится:
Первый - это «стандартный» общий (внешний) конструктор, который выводит параметр типа T из тип числителя и знаменателя, когда они имеют одинаковый тип.
Из этого я пришел к выводу, что этот конструктор обрабатывает случай двух параметров. Он выводит T из типа (num и den), а затем передает его внутреннему конструктору OurRational.
В документации говорится:
Второе применяется, когда данные значения числителя и знаменателя имеют разные типы: оно переводит их в общий тип, а затем делегирует конструкцию внешнему конструктор для аргументов соответствующего типа.
Глядя на код, я не вижу, как это происходит. Исходя из того, как я думаю, что Юлия оценивает, разве второй конструктор не обработает случай, когда оба n и d явные целые числа? Если иначе, у меня возникнут проблемы с тем, как Джулия видит эту линию. Кроме того, эллипсы в суффиксе присваивания означают что-то вроде "now go" для внешнего конструктора, когда оба параметра имеют одинаковый тип ", верно?
Я хорошо понимаю третий внешний конструктор.