Size: a a a

2020 November 06

r

red75prime in Rust Beginners
antuan
привет. помогите с энумами, пожалуйста.
примерно такой код:
struct Foo {}
struct Bar {}

enum Kind {
   Foo(Foo),
   Bar(Bar),
}

impl Kind {
   pub fn name(&self) -> String {
       ...
   }
}

struct AnotherStruct {
   kind: String,
   ...
}

fn get_by_enum_name(arg: Kind) -> Vec<AnotherStruct> {
   Ok(diesel_table
           .filter(diesel_table::kind.eq(arg.name()))
           .load::<AnotherStruct>(&POOL)
           .await?)
}

как это делают нормальные люди? я не хочу передавать Kind в аргумент, потому что для этого мне придется для каждого kind'а создать какую-то stub-структуру, чтобы иметь возможность передавать kind в качестве аргумента. мне же нужно только "название" из энума. делать отдельный энум и дублировать в него те же значения, понятное дело, тоже не хочется.
второй вопрос: как вменяемо нарыть name? :)
Передавать в функцию String (или &str) вместо Kind. Матчить Kind и брать имя из Foo или Bar.
источник

a

antuan in Rust Beginners
если имеется в виду имя из структуры, которая лежит внутри Kind::Foo или Kind::Bar, то не катит - у них нет name. arg - это именно название энума
источник

r

red75prime in Rust Beginners
Значит имя будет константное. Foo(_) => "Foo", Bar(_) => "Bar"
источник

a

antuan in Rust Beginners
в общем, типа такого?
impl Kind {
   pub fn name(&self) -> String {
       match self {
          Foo(_) => "Foo".to_string()
          Bar(_) => "Bar".to_string()
       }
   }
}
источник

r

red75prime in Rust Beginners
Функции, чтобы взять название варианта энума, нет.
источник

r

red75prime in Rust Beginners
antuan
в общем, типа такого?
impl Kind {
   pub fn name(&self) -> String {
       match self {
          Foo(_) => "Foo".to_string()
          Bar(_) => "Bar".to_string()
       }
   }
}
.to_string() можно за скобки вынести
источник

a

antuan in Rust Beginners
если да, то косяк в том, что тогда придется в arg прокидывать Kind::Foo(Foo{})\Kind::Bar(Bar{}), а делать этого, как я уже сказал, не хочется: у меня в коде это довольно-таки развесистые структуры и создавать придется создавать какие-то  константные стабы-значения под это добро
источник

r

red75prime in Rust Beginners
antuan
если да, то косяк в том, что тогда придется в arg прокидывать Kind::Foo(Foo{})\Kind::Bar(Bar{}), а делать этого, как я уже сказал, не хочется: у меня в коде это довольно-таки развесистые структуры и создавать придется создавать какие-то  константные стабы-значения под это добро
Почему туда строку нельзя передать?
источник

a

antuan in Rust Beginners
можно. но тогда варианты этой строки будут дублировать названия энума, будут константами и будут жить "где-то". и при перименовании энума нужно (желательно) гарантировать, что изменится и значение константы
источник

r

red75prime in Rust Beginners
Можно макрос сделать, который будет генерировать name()
источник

a

antuan in Rust Beginners
вариант с матчингом строки с энумом в принципе ок. но структурку-стаб юзать всё-таки не очень хочется
источник

a

antuan in Rust Beginners
можно. но как быть с аргументом энума?
источник

r

red75prime in Rust Beginners
antuan
можно. но как быть с аргументом энума?
В смысле? Имя же от него не зависит.
источник

r

red75prime in Rust Beginners
А, понял. Нужно, чтобы можно было передавать просто Kind::Variant
источник

a

antuan in Rust Beginners
нет. имя - это название значения.
```
impl Kind {
   pub fn name(&self) -> String {
       match self {
          Foo(_) => "Foo".to_string()
          Bar(_) => "Bar".to_string()
       }
   }
}
```
мы игнорируем аргумент. т.к. имя от него не зависит. именно поэтому мне наплевать на то, какой там аргумент. и именно поэтому мне в таком варианте придется использовать "стаб":
const FOOSTUB: Foo = Foo{}
get_by_enum_name(Kind::Foo(FOOSTUB))
источник

a

antuan in Rust Beginners
red75prime
А, понял. Нужно, чтобы можно было передавать просто Kind::Variant
да)
я могу путаться в названии сущностей, извиняйте :)
источник

АГ

Алексей Герасимов... in Rust Beginners
antuan
да)
я могу путаться в названии сущностей, извиняйте :)
может посмотреть в сторону https://github.com/Peternator7/strum
источник

a

antuan in Rust Beginners
энивей, придется же стаб-структуру пихать?
источник

АГ

Алексей Герасимов... in Rust Beginners
antuan
энивей, придется же стаб-структуру пихать?
источник

r

red75prime in Rust Beginners
Если хочется, чтобы всё было типобезопасно, то разве что делать макрос, который будет дополнительно генерировать enum KindVariant { Foo, Bar }.
источник