fields
단순히 구조체의 "구성 요소"입니다. 구조체
struct A
b
c::Int
end
필드를 가지고 b
와 c
. getfield
필드에 바인딩 된 객체 를 반환 하는 호출 :
julia> a = A("foo", 3)
A("foo", 3)
julia> getfield(a, :b)
"foo"
Julia의 초기 버전에서 구문 a.b
은 "낮게"(즉, writing과 동일) 사용되었습니다 getfield(a, :b)
. 이제 변경된 것은 기본 폴백으로 a.b
낮아집니다.getproperty(a, :b)
getproperty(a::Type, v::Symbol) = getfield(a, v)
따라서 기본적으로 아무것도 변경되지 않았습니다. 그러나 구조체의 작성자 는 도트 구문에 추가 기능을 제공하기 위해 getproperty
오버로드 할 수 있습니다 (오버로드 불가능 getfield
).
julia> function Base.getproperty(a::A, v::Symbol)
if v == :c
return getfield(a, :c) * 2
elseif v == :q
return "q"
else
return getfield(a, v)
end
end
julia> a.q
"q"
julia> getfield(a, :q)
ERROR: type A has no field q
julia> a.c
6
julia> getfield(a, :c)
3
julia> a.b
"foo"
따라서 도트 구문에 추가 기능을 추가 할 수 있습니다 (원하는 경우 동적으로). 이것이 유용한 구체적인 예로 PyCall.jl 패키지가 있는데, 여기서는 작성해야 pyobject[:field]
했지만 이제는 작성할 수 있도록 구현할 수 있습니다.pyobject.field.
차이 setfield!
와 setproperty!
의 차이와 유사 getfield
하고 getproperty
, 상기 설명했다.
또한 Base.propertynames
REPL에서 속성의 탭 완성을 제공하기 위해 함수에 연결할 수 있습니다. 기본적으로 필드 이름 만 표시됩니다.
julia> a.<TAB><TAB>
b c
그러나 과부하로 propertynames
인해 추가 속성을 표시 할 수도 있습니다 q
.
julia> Base.propertynames(::A) = (:b, :c, :q)
julia> a.<TAB><TAB>
b c q