Size: a a a

2020 November 06

a

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

АГ

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

r

red75prime in Rust Beginners
Алексей Герасимов
дак это оно и есть
Я написал до того как посмотрел
источник

a

antuan in Rust Beginners
пока что это кажется самым адекватным вариантом. но всё равно чуточку костыльным :)
спасибо
источник

АГ

Алексей Герасимов... in Rust Beginners
antuan
пока что это кажется самым адекватным вариантом. но всё равно чуточку костыльным :)
спасибо
ну извиняйте, тут не swift
источник

a

antuan in Rust Beginners
вообще, Kind::Foo, Kind::Bar это же функция, если верить компилятору:
println!("{:?}", Kind::Foo);
//19 |     println!("{:?}", Kind::Foo);
//  |                      ^^^^^^^^^ `fn(Foo) -> Kind {Kind::Foo}` cannot be formatted using `{:?}` because it doesn't implement `std::fmt::Debug`
источник

a

antuan in Rust Beginners
кажется, можно попытаться достать имя функции
источник

r

red75prime in Rust Beginners
antuan
кажется, можно попытаться достать имя функции
Тип функции уникален - да, но неназываем, так что прицепить к нему impl не выйдет.
источник

EG

Emmanuel Goldstein in Rust Beginners
red75prime
Тип функции уникален - да, но неназываем, так что прицепить к нему impl не выйдет.
Почему не называем? fn(Foo) -> Kind это вполне называемый тип
источник

EG

Emmanuel Goldstein in Rust Beginners
Это ж не замыкание
источник

MB

Mikail Bagishov in Rust Beginners
Emmanuel Goldstein
Почему не называем? fn(Foo) -> Kind это вполне называемый тип
У каждой функции свой собственный тип
источник

r

red75prime in Rust Beginners
Emmanuel Goldstein
Почему не называем? fn(Foo) -> Kind это вполне называемый тип
Это тип всех функций из Foo в Kind (точнее тип указателя на функцию). Каждая конкретная имеет свой тип
источник

MB

Mikail Bagishov in Rust Beginners
Который коэрсится в fn, но не является им
источник

EG

Emmanuel Goldstein in Rust Beginners
Mikail Bagishov
У каждой функции свой собственный тип
Да, действительно. Имплементировать трейт для функции не получается
источник

a

antuan in Rust Beginners
enum Kind {
   Foo(Foo),
   Bar(Bar),
}

fn get_name(s: &str) -> String {
   s.split(" :: ").last().unwrap().to_string()
}

fn main() {
   println!("{:?}", get_name(stringify!(Kind::Foo)));
}

// "Foo"

осталось понять, как сделать так, чтобы сделать так, чтоы можно было передавать любой вариант Kind'а...)
источник

АГ

Алексей Герасимов... in Rust Beginners
antuan
enum Kind {
   Foo(Foo),
   Bar(Bar),
}

fn get_name(s: &str) -> String {
   s.split(" :: ").last().unwrap().to_string()
}

fn main() {
   println!("{:?}", get_name(stringify!(Kind::Foo)));
}

// "Foo"

осталось понять, как сделать так, чтобы сделать так, чтоы можно было передавать любой вариант Kind'а...)
вам обязательно нужно строковое представление имени варианта?
источник

r

red75prime in Rust Beginners
Если все варианты имеют вид Foo(Foo), то name можно прицепить к struct Foo. Сделать trait Name: Into<Kind> { fn name() -> &'static str; } и макросами реализовать Name и Into<Kind> для всех вариантов
источник

a

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

a

antuan in Rust Beginners
red75prime
Если все варианты имеют вид Foo(Foo), то name можно прицепить к struct Foo. Сделать trait Name: Into<Kind> { fn name() -> &'static str; } и макросами реализовать Name и Into<Kind> для всех вариантов
спасибо, подумаю.
источник

АГ

Алексей Герасимов... in Rust Beginners
я бы вообще не стал завязываться на имя варианта, если эта строка во внешней системе будет храниться. или в принципе будет выходить за пределы памяти процесса. Иначе об этом надо постоянно помнить и нельзя переименовывать
источник