Mike
найтли собирает?
Anton
Кто-то вообще юзал Failure?
Anton
всё есть: #[macro_use] extern crate failure; #[macro_use] extern crate failure_derive;
big
хм
Loo
жиза
Anton
Хм, некий другой код завелся.. странно, разбираюсь
Anton
Всё хорошо, #[derive(Fail, Debug)] пропустил =)
Anton
спасибо за попытку помочь =)
Anton
поздно =)))
Anton
#macru use то есть =))
Anton
А говорил есть
Anonymous
типа типы есть, но доказать что эти типы в рантайме - хуй докажешь
Если тебе что-то приходит, и ты хочешь это проверить, это называется валидация. В случае с TS или Flow, самый надёжный вариант — валидация с выводом типов. Но это оффтоп. Просто для понимания того, что есть места, где ты сам обеспечиваешь себе эти гарантии.
Anonymous
Может показаться, что это слишком низкоуровневая возня. Но это тебе даёт возможность не пихать все проверки в рантайм, не жертвуя безопасностью.
Anonymous
Кстати. А как с этим в расте?
Anonymous
Допустим, моё приложение делает http-запрос, и получает нечто. Как мне провалидировать ответ и вывести тип?
Anonymous
что подразумевает твое "провалидировать"
Dan
вывести тип в рантайме? щта
Anonymous
Например, убедиться, что ответ соответствует { id: number, name?: string }
Anonymous
это же просто логика твоего приложения
Anonymous
статический анализ компилятора ортогонален ей
Sergey
Например, убедиться, что ответ соответствует { id: number, name?: string }
Описываешь тип ответа и парсишь через serde
Loo
ТИПЫ НЕ НУЖНЫ
Dan
Например, убедиться, что ответ соответствует { id: number, name?: string }
макрогенерить десериалайзер по типу данных который бы ругался
Anonymous
Описываешь тип ответа и парсишь через serde
И, если ответ не подходит под тип, то будет ошибка?
doc
Пробуй распарсить, если не смог, то данные ннвалидны
doc
Принцип прочтой
Dan
ТИПЫ НЕ НУЖНЫ
кстати а какой нынче "развернутый аргумент" про это? раньше говорили - потому что аннотации лень писать, но теперь везде вывод, че теперь говорят?
分解物質
Loo
обоже, зачем там вебсервер?
он статику сервит им
分解物質
встренный в генератор документации
分解物質
лолл
分解物質
тоесть поиск они не осилили а веб-сервер встроить смогли
分解物質
тупые хипстеры
Kerrigan
а почему не devdocs?
分解物質
он статику сервит им
типа статику сервить больше нечем
Tim
Посоны, для знающих людей простейший вопрос. Вот есть кодес, который не компилится: match my_hashmap.get(&my_key) { Some(value) => my_hashmap.insert(my_key, value+1), None => println!("no_value") } Ошибка: ^ expected (), found enum std::option::Option И как я понял - вся проблема в том, что HashMap::insert возвращает Option<T>. В чём заключается ошибка и как сделать чтобы компилилось?)
Anonymous
=> { my_hashmap.insert(my_key, value+1); },
Tim
понял, спасибо)
Anonymous
мб даже скобки не нужны
Tim
match my_hashmap.get(&key) { Some(value) => {my_hashmap.insert(key, value+1);}, None => println!("no_value") } теперь приводит к ошибке: | 11 | match my_hashmap.get(&key) { | ---------- immutable borrow occurs here 12 | Some(value) => {my_hashmap.insert(key, value+1);}, | ^^^^^^^^^^ mutable borrow occurs here 13 | None => {my_hashmap.insert(key, 1);} 14 | } | - immutable borrow ends here error[E0502]: cannot borrow `my_hashmap` as mutable because it is also borrowed as immutable --> src\main.rs:13:25 | 11 | match my_hashmap.get(&key) { | ---------- immutable borrow occurs here 12 | Some(value) => {my_hashmap.insert(key, value+1);}, 13 | None => {my_hashmap.insert(key, 1);} | ^^^^^^^^^^ mutable borrow occurs here 14 | } | - immutable borrow ends here я так понимаю это потому что у меня my_hashmap.get возвращает Option, в котором ссылка на значение в мапе. А есть какой-нить общепринятый способ для ключа: - если ключ есть в map - заинкрементить value - если ключа нет в map - добавить его со значением 1 ?
Anonymous
проще с get_mut
Tim
спс)
Tim
and_modify - unstable - не компилится; а как это сделать красиво через get_mut ? if let Some(x) = my_hashmap.get_mut(&key) { *x = *x+1; } else { my_hashmap.insert(key, 1); } приводит к: 11 | if let Some(x) = my_hashmap.get_mut(&key) { | ---------- first mutable borrow occurs here ... 14 | my_hashmap.insert(key, 1); | ^^^^^^^^^^ second mutable borrow occurs here 15 | } | - first borrow ends here
Tim
ну, сделал так - хотя бы работает: { let value = my_hashmap.entry(key).or_insert(0); *value += 1; } если кто знает на stable адекватные альтернативы - реквестирую)
պլհկ
Это норма
Alexander
а есть какие-то планы по mutable borrow в pattern-guard ? - достало.
Денис
а есть какие-то планы по mutable borrow в pattern-guard ? - достало.
если тебя это напрягает, то как дело обстоит с Fn, Threads, и другими делами. конечно плагин возможен, но зачем если ты не контролируешь теже замыкания FnMut, Fn (тотже многопоток при FnMut исключается. кто тебе об этом скажет)
Денис
тоесть. if let Some(mut x) = my_hashmap.get_mut «< и ref забыл... этож всеравно ссылище
Anonymous
нет разницы
Денис
есть разница)) это просто не компится
Anonymous
есть разница)) это просто не компится
https://play.rust-lang.org/?gist=af3e167ddd8a5caf2ed88c48db328659&version=stable
Tim
ага, компилится и работает
Денис
https://play.rust-lang.org/?gist=af3e167ddd8a5caf2ed88c48db328659&version=stable
да вижу работает. хоть это даже странно
Anonymous
ничего странного
Anonymous
&mut тип и mut переменная это разные вещи
Денис
аа все отпадает. он изначально делает &mut. поэтому в X изначально &mut x
Денис
pub fn get_mut<Q: ?Sized😠&mut self, k: &Q) -> Option<&mut V>
Денис
https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.get_mut
Денис
хотя раньше этого не делал) или я давно хешами не пользовался...
Anonymous
о интересно
Денис
Non lexical lifetimes же позволит, не?
лексика... какбы mut даже 1. не может существовать в одно и тоже время более одного мута, значит плагин должен исключать это, а значит изначально анализировать. 2. Про многопоточность тажа история, mut может быть только один и ты его контролируешь.
Антон
вроде AsciiExt по дефолту не импортится
Ну да. Но теперь его методы прикреплены напрямую к примитивным типам, так что уже как бы и не нужен
Антон
И да... Месье читает r/rustjerk?
Marat
какой пример?
if let Some(x) = my_hashmap.get_mut(&key) { *x = *x+1; } else { my_hashmap.insert(key, 1); }
Marat
Вот этот