fields
เป็นเพียง "ส่วนประกอบ" ของโครงสร้าง โครงสร้าง
struct A
b
c::Int
end
มีทุ่งนาและb
c
การเรียกเพื่อgetfield
ส่งคืนวัตถุที่ถูกผูกไว้กับเขตข้อมูล:
julia> a = A("foo", 3)
A("foo", 3)
julia> getfield(a, :b)
"foo"
ในรุ่นแรกของจูเลียไวยากรณ์a.b
ที่ใช้ในการ "ลด" getfield(a, :b)
คือเป็นเช่นเดียวกับการเขียน สิ่งที่เปลี่ยนแปลงไปในขณะนี้คือการ a.b
ลดลงgetproperty(a, :b)
เมื่อเลือกทางเลือกเริ่มต้น
getproperty(a::Type, v::Symbol) = getfield(a, v)
ดังนั้นโดยค่าเริ่มต้นไม่มีอะไรเปลี่ยนแปลง อย่างไรก็ตามผู้เขียน structs สามารถโอเวอร์โหลด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