Этот фрагмент из реализации Rational Numbers в Джулии:
# Rational.jl
# ...
Rational{T<:Integer}(n::T, d::T) = Rational{T}(n,d)
Rational(n::Integer, d::Integer) = Rational(promote(n,d)...)
Rational(n::Integer) = Rational(n,one(n))
//(x::Rational, y::Integer) = x.num // (x.den*y) <--- HERE!
# ...
Посмотрите, как реализована функция //
, а затем используется с нотификацией infix? Как это действительно возвращает значение?
Когда я увидел этот код, я интерпретировал его так:
- Функция
//
вызывается с помощью Rational и Integer. - Но тогда он делает рекурсивный вызов без каких-либо других аргументов.
# 2 - это тот, который меня действительно смущает. Где заканчивается рекурсия в структуре данных? Как //
возвращает значение, если оно постоянно ничего не оценивает?
Пожалуйста, помогите мне понять это.