Anonymous
ведь
Vladimir
что ты сметчишь
Vladimir
тот же еенам?)
Anonymous
хм?
Anonymous
не понял проблему
Vladimir
ну у тебя в a будет Enum::User
Anonymous
ну
Anonymous
юзер вне енама не существует
Vladimir
хочется, иметь функцию handle_user которая будет принимать только статически типизированного юзера
Vladimir
да
Vladimir
в этом и проблема
Vladimir
классический динамический диспатч, есть несколько типов сообщений, нужно каждый по своему хендлить
Vladimir
энам это динамический диспатч
Vladimir
нету возможности задать функцию fn handle_commit(Enum::User{name:name, lastname:lastname});
Anonymous
ооо
Alexander
Сказал лн и запустил дукер
Ну, блин, как можно пользоваться докером в 2к17, когда православный vagga завезли?
Alexander
блин вот не попишешь с год и все забываешь
Alexander
есть какой-нибудь человеческий вариант если есть enum: enum Foo { Foo(Box Foo,u16) Bar } проматчить то, что в Box?
Vladimir
всмысле
Alexander
вот хочу сделать match t { Foo(Bar,_) => ...
Vladimir
иф с ref
Alexander
так, если я правильно понял ref, то получается, что я не могу сделать:
Vladimir
#[derive(PartialEq)] enum Foo { Foo(Box<Foo>,u16), Bar } fn main() { match Foo::Foo(Box::new(Foo::Bar), 12) { Bar => println!("1"), Foo::Foo(ref b,_) if **b == Foo::Bar => println!("2"), _ => println!("3"), } }
Alexander
match t { Foo(Foo(_,5),_) =>
Vladimir
только так
Alexander
а понял
Alexander
хм..
Vladimir
бокс у тебя не структура, его нельзя матчить
Vladimir
точнее можно, если создать идентичный по содержимому бокс, но нельзя
Alexander
все не как у людей :/ ясно
Vladimir
а как у людей?)
Alexander
Vladimir
х)
Alexander
у людей можно написать паттерн матчинг по вложенным структурам, часть из которых в boxed values
Vladimir
ну боксед не структура просто
Vladimir
вот по этому и нельзя
Alexander
или можно сложные вещи в гардах (.. if ) писать
Vladimir
у матч бренчи статические
Alexander
т.е. если бы я мог в гарде написать Foo(ref b) if match ** b { ... }
Vladimir
так и тут можешь
Alexander
могу?
Vladimir
а не
Vladimir
хотя
Vladimir
скорее нет
Alexander
т.е. если не сматчилось, то провалиться дальше
Vladimir
хотя наверное можешь
Alexander
во внешнем
Vladimir
тебе же матч тупо чтоб вернуть тру или фолс
Vladimir
внутри гварда
Vladimir
а раст же експрешен ориентед
Alexander
в конкретном случае - да
Alexander
т.е. я хочу сделать deref поля и проматчить его с шаблоном
Alexander
если смачилось то перейти в то что в => со всеми переменными полученными в результате матча, если не сматчилось то продолжить дальше
Alexander
в целом это все и обойти можно, но код будет чуть печальнее (и я _пока_ не виду принципиальных причин) почему так нельзя в языке с гарантиями раста
Vladimir
#[derive(PartialEq)] enum Foo { Foo(Box<Foo>,u16), Bar } fn main() { match Foo::Foo(Box::new(Foo::Bar), 12) { Foo::Bar => println!("1"), Foo::Foo(ref b,_) if match **b { Foo::Bar => true, _ => false }=> println!("2"), _ => println!("3"), } }
Vladimir
так можно
Alexander
ном
Alexander
для этого случая подойдет, но в целом нет
Alexander
если бы в матче Some(x) можно было вернуть и тогда бы продолжилось, то решило бы проблемы мои
Vladimir
ну внутрь матча можно пропихивать все переменные которые видны внешне
Vladimir
ну сорян
Alexander
да норм все, я вспоминаю язык
Vladimir
ты какуе-то цикловую асинхронную хуйню хочешь
Vladimir
стейтмашину короче
Alexander
(а)синхронности тут нет
Vladimir
угу
Vladimir
стейт машину
Alexander
просто применяю правила к древовидной структуре
Alexander
как стейт машину тоже можно представить
Alexander
а вообще грубо говоря переношу правила вывода из книжки в программу
Alexander
ибо решил таки пройти пирса на расте
Vladimir
ну вот ты хочешь Стейт машину, причем чтоб за один next_state обрабатывалось несколько стейтов
Vladimir
т.е. не детерминированую
Alexander
нет
Vladimir
а не "асинхронную" как я сказал раньше
Vladimir
ну ты же хочешь возвращать Стейт, который дальше должен матчится
Alexander
еслиу нас не mut то все детерминировано