В Julia 1.0 точечный синтаксис x.s
является сокращением для getproperty(x, :s)
, так же как x[idx]
отображается на getindex(x, idx)
. Следовательно, вы можете заставить его вести себя так, как вы хотите. Только общее значение по умолчанию эквивалентно предоставлению вам доступа к полям объекта. Чтобы увидеть конкретный метод, который вызывается для объектов типа Cholesky
, вы можете использовать @which
следующим образом:
julia> @which chol.U
getproperty(C::Cholesky, d::Symbol) in LinearAlgebra at C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.0\LinearAlgebra\src\cholesky.jl:339
Если вы проверите исходный код в cholesky.jl: 339 , вы обнаружите следующее:
function getproperty(C::Cholesky, d::Symbol)
Cfactors = getfield(C, :factors)
Cuplo = getfield(C, :uplo)
info = getfield(C, :info)
if d == :U
return UpperTriangular(Cuplo === char_uplo(d) ? Cfactors : copy(Cfactors'))
elseif d == :L
return LowerTriangular(Cuplo === char_uplo(d) ? Cfactors : copy(Cfactors'))
elseif d == :UL
return (Cuplo === 'U' ? UpperTriangular(Cfactors) : LowerTriangular(Cfactors))
else
return getfield(C, d)
end
end
Мы видим, что в случае d == :U
он не отображается на что-то вроде getfield(C, d)
, а вместо этого создает матрицу UpperTriangular
каким-то образом. Только для некоторого общего символа d
метод отображается на getfield(C, d)
.
Наконец, кулон fieldnames
для полей propertynames
для свойств (вещи, которые вы можете написать для s
в x.s
):
julia> propertynames(chol)
(:U, :L, :UL)
julia> fieldnames(typeof(chol))
(:factors, :uplo, :info)
Как видите, два понятия, поля и свойства, могут быть ортогональными. В этом случае прямого перекрытия нет.