سازنده‌ها (Constructors) در جولیا

سازنده پیش‌فرض، سازنده سفارشی با اعتبارسنجی و سازنده‌های کمکی

سازنده چیست؟

وقتی struct تعریف می‌کنید، جولیا خودکار یک سازنده پیش‌فرض می‌سازد که همه فیلدها را می‌گیرد:

struct Point
    x::Float64
    y::Float64
end

p = Point(3.0, 4.0)   # سازنده پیش‌فرض

سازنده سفارشی — با اعتبارسنجی!

معمولاً می‌خواهید هنگام ساخت، قوانین بررسی شوند:

struct Positive
    value::Float64
end

# سازنده سفارشی
function Positive(v)
    if v <= 0
        error("مقدار باید مثبت باشد! ($v)")
    end
    return new(v)
end

p = Positive(5.0)      # ✅
-- Positive(-1.0)     -- ❌ خطا!
داخل تعریف struct، new شیء واقعی را می‌سازد — فقط در سازنده داخلی قابل استفاده است!

مثال: اعتبارسنجی ایمیل (ساده)

struct User
    name::String
    age::Int
end

function User(name, age)
    if age < 0
        error("سن نمی‌تواند منفی باشد!")
    end
    if isempty(name)
        error("نام خالی است!")
    end
    return new(name, age)
end

u = User("علی", 25)   # ✅
-- User("", 25)      -- ❌ نام خالی است!

سازنده‌های کمکی (Outer)

می‌توانید چند روش ساخت برای یک نوع تعریف کنید:

struct Temperature
    celsius::Float64
end

# سازنده با فارنهایت!
Temperature(f::Int) = Temperature((f - 32) * 5 / 9)

t1 = Temperature(25.0)     # مستقیم سلسیوس
t2 = Temperature(77)       # تفسیر به‌عنوان فارنهایت!

println(t1.celsius)   # 25.0
println(t2.celsius)   # 25.0 (77F = 25C)

سازنده با مقادیر پیش‌فرض

struct Config
    host::String
    port::Int
    debug::Bool
end

# سازنده با پیش‌فرض
Config(host) = Config(host, 8080, false)
Config(host, port) = Config(host, port, false)

c1 = Config("localhost")
c2 = Config("localhost", 3000)
c3 = Config("localhost", 3000, true)

println("$(c1.host):$(c1.port) debug=$(c1.debug)")

مثال کامل: ساخت Point های خاص

struct Point
    x::Float64
    y::Float64
end

# سازنده قطبی!
function Point(r::Float64, θ::Float64, ::Type{Val{:polar}})
    return Point(r * cos(θ), r * sin(θ))
end

# سازنده‌های ساده‌تر
origin() = Point(0.0, 0.0)
onXAxis(x) = Point(x, 0.0)

p = origin()
println("مبدأ: ($(p.x), $(p.y))")

q = onXAxis(5.0)
println("روی محور X: ($(q.x), $(q.y))")
الگوی رایج: سازنده پیش‌فرض + سازنده‌های کمکی برای موارد پرکاربرد — کد تمیز و امن!

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

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