سازندهها (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))")
الگوی رایج: سازنده پیشفرض + سازندههای کمکی برای موارد پرکاربرد — کد تمیز و امن!
این مبحث بخشی از دوره آموزش کامل جولیا است.