Перегрузка функций по параметрам

В Rust, по релизиозно-техническим причинам не хотят добавлять перегрузку функций по параметрам. Фактически, доступен только вариант из Си с созданием кучи функций с разными именами. На мой взгляд, это просто дико не удобно. Немного подумав, нашел не очень красивый, но работающий обходной вариант:

enum foo_param {
    i(int),
    s(str)
}

fn foo(param: foo_param) {
    alt param {
        i(int_val) {
            io::println(#fmt("foo was called with int == %d", int_val));
        }
        s(str_val) {
            io::println(#fmt("foo was called with str == %s", str_val));
        }
    }
}

fn main() {
    foo(i(10));
    foo(s("test"));
}


Пока только не соображу, как сделать перегрузку по количеству аргументов.

Upd:
Да, еще можно сделать следующим образом, но на мой взгляд, это совсем уж взрыв мозга и порнография:

impl methods for int {
    fn foo() {
        io::println(#fmt("foo was called with int == %d", self));
    }
}
impl methods for str {
    fn foo() {
        io::println(#fmt("foo was called with str == %s", self));
    }
}
// ....
10.foo();
"test".foo();

Leave a Reply