Comments 28
Выглядит вполне ничего, за исключением постоянного unwrap(). Впрочем, в go есть такое же в виде if err != nil. Ещё обидно, что стек-трейсы можно увидеть только в отладочной версии программы (в go они будут видны всегда).
0
Насчёт .unwrap() — в этом-то и разница. В go ошибку можно не обрабатывать и это будет невидимо в исходном коде — так же, как и в Си. В Rust не проверенная ошибка (т.е. например Result, который не используется) вызывает предупреждение компилятора, а простейший способ её не обрабатывать — .unwrap() — помечает данное место как явно не обрабатывающее ошибки.
Представьте себе, что вам нужно в проекте на go из 10000 строк найти все места, где ошибки не обрабатываются, и оценить, сколько временеи нужно будет на приделывание правильной обработки. Вам придётся делать это, вручную вычитывая код. В Rust достаточно текстового поиска.
Представьте себе, что вам нужно в проекте на go из 10000 строк найти все места, где ошибки не обрабатываются, и оценить, сколько временеи нужно будет на приделывание правильной обработки. Вам придётся делать это, вручную вычитывая код. В Rust достаточно текстового поиска.
+2
В го можно искать по коду "_".
+3
Go линтеры, вроде errcheck отлично справляются с этой задачей
0
А как они работают?
0
Анализирует код проекта и выдает список проблем с указанием файлов, номеров строк. В моем случае подсвечивает строки в редакторе (sublime), в которых есть необработанные ошибки.
0
Я имею ввиду, как анализируют. Знают, какие функции ошибки возвращают, или действительно, достаточно искать _ как выше предлагают?
0
Ну не я разработчик линтера.
Вообще выявляет как при использовании методов из пакетов, подключенных с гитхаба, так и собственных методов в проекте и стандартных. А по _ можно искать только маскированные ошибки, ведь по сути можно значение даже не получать.

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

0
Они парсят весь код на Go согласно синтаксису и проверяют.
0
Я не совсем понял: Rust сумеет при этом коде защитить от SQL injection или выполнит все что придет из запросов?
0
Вы про законченную версию из репозитория? Потому что здесь-то запросы к базе статические и защищать не от чего.
0
Да, вы пробовали отправлять sql injection в запросах законченной версии? Они нормально отсекались?
0
Это делает не Rust как таковой, а библиотека postgres, но да, он типобезопасен:
Заголовок спойлера
$ RUST_BACKTRACE=1 cargo run -- del '-1 OR 1=1' Running `target/debug/rust-phonebook del -1\ OR\ 1=1` thread '<main>' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }', ../src/libcore/result.rs:736 stack backtrace: 1: 0x555c75a62f49 - sys::backtrace::tracing::imp::write::ha2610c4d9f39e7d20qt 2: 0x555c75a62128 - panicking::on_panic::h0137eb721b989e66zqx 3: 0x555c75a551fe - sys_common::unwind::begin_unwind_inner::h9323ab6063ed22d03es 4: 0x555c75a55998 - sys_common::unwind::begin_unwind_fmt::hd6d1e3432b74d1dc9ds 5: 0x555c75a619a1 - rust_begin_unwind 6: 0x555c75a91aff - panicking::panic_fmt::h3b414ef7ca9e7ec0wZK 7: 0x555c7586bff6 - result::Result<T, E>::unwrap::h17631234665356226696 at ../src/libcore/macros.rs:28 8: 0x555c7586ae97 - main::closure.11714 at src/main.rs:85 9: 0x555c7586ae3c - ops::impls::_&'a mut F.FnOnce<A>::call_once::h16646540071590734845 at ../src/libcore/ops.rs:1795 10: 0x555c7586ade2 - option::Option<T>::map::h18348351940653665552 at ../src/libcore/option.rs:425 11: 0x555c7586ad9c - iter::Map<I, F>.Iterator::next::h6843473521919548427 at ../src/libcore/iter.rs:1686 12: 0x555c7586aadc - vec::Vec<T>.FromIterator<T>::from_iter::h16476383075473108179 at ../src/libcollections/vec.rs:1160 13: 0x555c7586aa79 - iter::Iterator::collect::h14488226810590600205 at ../src/libcore/iter.rs:567 14: 0x555c758627f7 - main::h89fbfb3db45c0143MAa at src/main.rs:84 15: 0x555c75a64b94 - sys_common::unwind::try::try_fn::h5089277237340746579 16: 0x555c75a61808 - __rust_try 17: 0x555c75a6482d - rt::lang_start::h377d03c3ab92e2f1kox 18: 0x555c758b9609 - main 19: 0x7ffb915336ff - __libc_start_main 20: 0x555c7581eaf8 - _start 21: 0x0 - <unknown>
+3
Спасибо, посмотрел на код на github'е: iron выглядит очень неплохо, тем более для низкоуровнего языка.
С нетерпением жду следующих статей.
С нетерпением жду следующих статей.
0
let me = Person {
id: 0,
name: "Михаил".to_string(),
data: None
};
для id нельзя задать None?
А «Михаил» не строка?!
+1
А «Михаил» не строка?!
Строковые константы имеют тип &'static str, т.е. являются string slice, а в структуре у поля тип String — heap-allocated string, изменяемая строка. Почему выбран именно он — отдельный вопрос, потому как для &'a str тоже есть трейт ToSql и в execute можно напрямую передавать &'static str.
Строковые константы имеют тип &'static str, т.е. являются string slice, а в структуре у поля тип String — heap-allocated string, изменяемая строка. Почему выбран именно он — отдельный вопрос, потому как для &'a str тоже есть трейт ToSql и в execute можно напрямую передавать &'static str.
+1
для id нельзя задать None?id объявлен в структуре как i32, это обычное 32-битное знаковое число, у которого нет такого значения как None. Чтобы было None, нужно его объявить как Option<i32>, тогда возможными значениями были бы None, Some(0) (но не 0), Some(1), Some(-5), Some(99845) и т.д.
А "Михаил" не строка?!Разница примерно как между const char* и std::string в С++, там можно написать std::string("Михаил"), только С++ может сам добавить неявный вызов этого конструктора. В Rust "Михаил" имеет тип &str, он содержит указатель на начало utf-8 строки и её длину, to_string() преобразует его в String.
0
Уже написали несколько объяснений, но я попробую ещё раз, потому что про строки любят спрашивать :)
«Михаил» — это строковый литерал, это не «объект». Его нельзя изменять, например. Это «unboxed» значение, и to_string превращает его в boxed значение на куче.
«Михаил» — это строковый литерал, это не «объект». Его нельзя изменять, например. Это «unboxed» значение, и to_string превращает его в boxed значение на куче.
-1
А «Михаил» не строка?!
pub struct Person<'a> {
pub name: &'a str,
}
fn main() {
let me = Person {
name: "Михаил",
};
}
0
Хабру пора добавить подсветку для Rust.
0
Only those users with full accounts are able to leave comments. Log in, please.
Создаём REST-сервис на PostgreSQL и Rust. Часть 1: прототип