Pull to refresh

Comments 5

UFO landed and left these words here
Но ведь для такого уже есть плюсы, зачем ещё одни? Никогда не понимал, кстати, необходимости такой перегрузки (кроме конструкторов, пожалуй). Это очень академический подход, порождающий порой неявные ошибки.
Кстати, задумался сегодня об этом и вспомнил эту статью. Тут, разумеется, рабочее решение, хотя и написано громоздко. Но тут скорее речь идёт не о перегрузке, а о решении через джинерики-шаблоны. Нюанс этого решения в том, что в функцию всегда передаётся фиксированное число аргументов.
Раст очень многое впитал от функциональных языков, и это можно решить через алгебраические типы-перечисления, ведь с ними в функцию можно передать какие удобно аргументы. Как-то так, например:
enum Color {
    Grin {r: u8, s: String},
    Red (f32)
}

fn func(e: Color) {
    match e {
        Color::Grin { r, s } => {
            println!("Grin: {}, {}", r, s)
        },
        Color::Red (t) => {
            println!("Red: {}", t)
        }
    };
}

fn main() {
    func(Color::Grin {r: 9, s: String::from("not bad") });
    func(Color::Red (4.5));
}

Уважаемый автор.

Это не компилируется, ибо вызов неоднозначен и Rust не пытается выяснить, какая их функций — в зависимости от типов/числа аргументов — вызывается


На 2025 год компилируется
https://play.rust-lang.org/?version=stable&mode=debug&edition=2015&gist=871b644b8238afbae53a801a92242f04


Compiling playground v0.0.1 (/playground)
warning: trait FooA is never used
--> src/main.rs:1:7
|
1 | trait FooA { fn foo(_: i32); }
| ^^^^
|
= note: #[warn(dead_code)] on by default

warning: playground (bin "playground") generated 1 warning
Finished dev profile [unoptimized + debuginfo] target(s) in 0.82s
Running target/debug/playground
Standard Output
FooB

Sign up to leave a comment.

Articles