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)

این مبحث بخشی از دوره آموزش کامل جولیا است.

ابزارهای مرتبط