Pull to refresh

Comments 21

Конкретно в этой версии ничего особо связанного (и в ближайших следующих ничего не предвидется), но в новой редакции книги есть глава про этот вопрос: http://rustbook.ru/ch17-00-oop.html


А в целом ответ классический — ооп в мэйнстримовом понимании термина нет, задачи решаются другими приемами.

Чуть лучше чем в Go (нет двух разных nil и прочих приколов). Значительно лучше чем в Си. Но хуже чем в объектно-ориентированных языках.

Макрос для отладки прямо лучше, чем я мог представить. Это должно было в первую версию попасть.

А мне ненравится. Они недогадались, чтобы можно было переменные через запятую перечислить.
В результате, вроде он и есть — но не очень нужен, хотя сама идея была хорошей.

Как-то слишком категорично, тем более что:
1) такое изменение можно внести потом, потому что оно обратно-совместимо;
2) ценой одной пары скобок это уже можно делать через кортеж:


fn main() {
    let a = 0_u8;
    let b = a + 1;
    let c = "no";
    dbg!((a, b, c));
}

   Compiling playground v0.0.1 (/playground)
    Finished dev [unoptimized + debuginfo] target(s) in 0.63s
     Running `target/debug/playground`
[src/main.rs:5] (a, b, c) = (
    0,
    1,
    "no"
)

Playground

Этот костыль работает, но логичней было бы видеть вывод какой-то такой:

[src/main.rs:5] a=0, b=1, c=«no»


а то сопоставлять переменные со значением неудобно.

Но тогда будет костыль с тем, что в этом специальном случае вызова "dbg!" он внезапно будет возвращать или (), или втихоря паковать перменные в кортеж.
Если возможность прозрачной вставки в середину выражения не нужна, то, кмк, проще ак и раньше "eprintln!" использовать с какой угодно форматной строкой:


eprintln!("a={}, b={}, c={}", a, b, c);

Меня бы устроило, чтобы он возвращал () в варианте, когда в него передается несколько переменных.

Если сильно надо, то такое довольно просто реализуется:


macro_rules! dbgs {
    ($val:expr) => {
        dbg!($val)
    };
    ($($val:expr),+) => {
        eprint!("[{}:{}]", file!(), line!());
        dbgs!(@dbgs $($val),+);
        eprintln!();
    };
    (@dbgs $current:expr, $($val:expr),+) => {
        eprint!(" {} = {:#?},", stringify!($current), $current);
        dbgs!(@dbgs $($val),+);
    };
    (@dbgs $last:expr) => {
        eprint!(" {} = {:#?}", stringify!($last), $last);
    }
}
...
let a = 2;
let b = 3;

dbgs!(a + b);
dbgs!(a, b, a + b);

После запуска:


[src/main.rs:23] a + b = 5
[src/main.rs:24] a = 2, b = 3, a + b = 5
Да, и тем больней осознавать, что такого нет в стандартной либе. Делается просто, нужно всем — а в либу не включили.
А что макрос должен возвращать, если ему на вход попали две перечисленные через запятую переменные?
а зачем ему вообще что-то возвращать? пускай хотя бы void или по-растовскому () возвращает.

Извините, а вы обсуждаемый пост читали?


Один из сценариев использования макроса dbg! — внедрение его внутрь вычисляемого выражения без изменения остальных частей кода.

Такого, чтобы внедряли и внутри было несколько переменных через запятую — не могу представить. Хотелось бы увидеть пример.

Как минимум офигенная штука для отладки кода в плейпене. Я (как и многие растовики) часто там код пишу, а нормального отладчика там все равно нет и вряд ли имеет смысл заморачиваться с втаскиванием.

Появилась возможность использовать русские/не латинские имена переменных и функций? Вроде в сообществе было обсуждение этой темы и собирались сделать...

Sign up to leave a comment.

Articles