Struct ها در جولیا
تعریف struct، فیلدهای نوعدار، mutable struct و ترکیب با dispatch
Struct چیست؟
Struct نوع داده سفارشی شماست — مثل «کلاس» اما سبکتر و سریعتر:
struct Point
x::Float64
y::Float64
end
# ساخت نمونه
p = Point(3.0, 4.0)
# دسترسی به فیلدها
println(p.x) # 3.0
println(p.y) # 4.0
struct تغییرناپذیر است!
p = Point(3.0, 4.0)
-- p.x = 99.0 -- ❌ خطا! struct پیشفرض تغییرناپذیر است
mutable struct — تغییرپذیر
mutable struct Player
name::String
health::Int
score::Int
end
player = Player("علی", 100, 0)
# تغییر مجاز!
player.health -= 30
player.score += 50
println("$(player.name): سلامت=$(player.health)، امتیاز=$(player.score)")
قاعده: اگر دادهتان ثابت است (مثل مختصات) از
struct استفاده کنید — سریعتر است. اگر باید تغییر کند (مثل وضعیت بازیکن) از mutable struct.struct با dispatch — ترکیب طلایی!
struct Circle
radius::Float64
end
struct Rectangle
width::Float64
height::Float64
end
# متدهای dispatch برای هر شکل
function area(c::Circle)
return π * c.radius^2
end
function area(r::Rectangle)
return r.width * r.height
end
function describe(shape)
return "مساحت: $(round(area(shape), digits=2))"
end
println(describe(Circle(5.0)))
println(describe(Rectangle(4.0, 6.0)))
struct با فیلد بدون نوع
struct Box
content # بدون نوع — Any
end
b1 = Box(42)
b2 = Box("سلام")
println(b1.content, " ", b2.content)
فیلد بدون نوع = Any = کندی! همیشه برای فیلدها نوع مشخص کنید (یا حداقل نوع انتزاعی مثل
Real).struct تو در تو
struct Address
city::String
street::String
end
struct Person
name::String
address::Address
end
ali = Person("علی", Address("تهران", "ولیعصر"))
println(ali.name, " از ", ali.address.city)
آرایهای از struct ها
people = [
Person("علی", Address("تهران", "ولیعصر")),
Person("مریم", Address("شیراز", "زند")),
]
for p in people
println("$(p.name) — $(p.address.city)")
end
مثال کامل: سیستم بانکی
mutable struct Account
owner::String
balance::Float64
end
function deposit!(acc::Account, amount::Float64)
acc.balance += amount
return acc.balance
end
function withdraw!(acc::Account, amount::Float64)
if amount > acc.balance
println("موجودی کافی نیست!")
return acc.balance
end
acc.balance -= amount
return acc.balance
end
acc = Account("علی", 1000.0)
deposit!(acc, 500.0)
println("موجودی: ", acc.balance)
withdraw!(acc, 200.0)
println("موجودی: ", acc.balance)
این مبحث بخشی از دوره آموزش کامل جولیا است.