متدها و 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
PythonDuck typing + single dispatch (functools)
JuliaMultiple Dispatch — همه آرگومان‌ها!

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

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