متدها و Multiple Dispatch در جولیا
قلب جولیا: تعریف چند متد برای یک تابع بر اساس نوع آرگومانها
Multiple Dispatch — قلب جولیا!
این مهمترین مبحث جولیاست! در جولیا یک تابع میتواند چند متد داشته باشد — هر کدام برای نوع آرگومانهای متفاوت:
-- متد ۱: برای اعداد
function describe(x::Number)
return "عدد: $x"
end
-- متد ۲: برای رشتهها
function describe(x::String)
return "رشته: $x"
end
-- متد ۳: برای آرایهها
function describe(x::Array)
return "آرایه با $(length(x)) عنصر"
end
println(describe(42)) # عدد: 42
println(describe("سلام")) # رشته: سلام
println(describe([1,2,3])) # آرایه با 3 عنصر
جولیا بر اساس نوع همه آرگومانها (نه فقط اولی!) متد مناسب را انتخاب میکند — این «Multiple Dispatch» است و دلیل اصلی سرعت و انعطاف جولیا!
نحوه نوشتن ::
علامت :: برای مشخص کردن نوع آرگومان:
function area(x::Float64)
return x^2
end
-- حالا فقط Float64 قبول میکند:
println(area(2.5)) # 6.25
-- area(2) -- ❌ خطا! Int64 نیست
Dispatch بر اساس چند آرگومان
function combine(a::Number, b::Number)
return a + b
end
function combine(a::String, b::String)
return a * " و " * b
end
function combine(a::Number, b::String)
return "عدد $a با رشته $b"
end
println(combine(5, 3)) # 8
println(combine("سیب", "موز")) # سیب و موز
println(combine(5, "سیب")) # عدد 5 با رشته سیب
دیدن متدهای یک تابع
println(methods(describe))
-- ۳ متد برای describe را نشان میدهد!
متد با نوع انتزاعی
-- Integer شامل Int8, Int16, Int32, Int64...
function isPositive(x::Integer)
return x > 0
end
println(isPositive(5)) # Int64 — کار میکند
println(isPositive(Int8(3))) # Int8 — هم کار میکند!
مثال عملی: محاسبه مساحت اشکال
struct Circle
radius::Float64
end
struct Rectangle
width::Float64
height::Float64
end
-- یک تابع، دو متد!
function area(shape::Circle)
return π * shape.radius^2
end
function area(shape::Rectangle)
return shape.width * shape.height
end
c = Circle(5.0)
r = Rectangle(4.0, 6.0)
println(area(c)) # 78.5...
println(area(r)) # 24.0
این الگو (struct + متدهای dispatch) جایگزین «کلاس و ارثبری» در جولیاست — تمیزتر و سریعتر!
چرا Multiple Dispatch مهم است؟
- سرعت: کامپایلر میداند کدام متد صدا زده میشود — کد بهینه تولید میکند
- انعطاف: بدون تغییر کد قبلی، رفتار جدید اضافه کنید
- خوانایی: هر متد فقط یک کار مشخص دارد
- گسترشپذیری: حتی برای انواع کتابخانههای دیگر متد اضافه کنید!
مقایسه با زبانهای دیگر
| زبان | مکانیزم |
|---|---|
| Java / C++ | Single dispatch (this) + overloading |
| Python | Duck typing + single dispatch (functools) |
| Julia | Multiple Dispatch — همه آرگومانها! |
این مبحث بخشی از دوره آموزش کامل جولیا است.