Vladimir
Ты шоли джавы обкурился?
Vladimir
С частично инициализированными классами
Vladimir
Когда обращение к неинициализированному полю бросает исключение
Αλεχ
impl Foo { pub fn new(a: i32 = 1, b: i32 = 2, c: i32 = 10) -> Self {} }
Αλεχ
ну например так
Vladimir
Эт частичныц случай перегрузки, вообще не про руст.
Αλεχ
в расте нет перегрузок
Anonymous
Ребят, у меня это borrowed value does not live long enough
Vladimir
impl Foo { pub fn new(a: i32 = 1, b: i32 = 2, c: i32 = 10) -> Self {} }
Foo{ a:12, ..Default::default() } Но публичные поля низя, так что сорян
Anonymous
Океюшки
Vladimir
Вообще кстати билдеры через дефолтные структуры, не модно в Русте?
Αλεχ
есть дерайв
պլհկ
Билдеры через дерайв модно
Αλεχ
но оно такое
Денис
impl Foo { pub fn new(a: i32 = 1, b: i32 = 2, c: i32 = 10) -> Self {} }
ты не поверишь, но..... https://github.com/colin-kiegel/rust-derive-builder
Vladimir
Ну эт ж нужно методы вызывать, а так всё в одном месте
red75prime
macro_rules!
Αλεχ
ток это не очень
Денис
чё не очень-то?
Денис
это же прям ровно то, что нужно, нет?
Αλεχ
не очень
Αλεχ
хоят конечно неплохо
Αλεχ
я про него знал
Αλεχ
ну например непонятно, как объявить часть обязательных полей, а часть - нет
Αλεχ
там можно сделать валидацию с паникой, но эт такое
Αλεχ
так-то у тебя build unwrap
Αλεχ
и может быть паника
Αλεχ
с дефолтными параметрами паники точно нет
Αλεχ
ну короч first class citizen всегда удобнее
Αλεχ
я понимаю, что макросы в расте позволяют кучу прикольных штуковин делать
Αλεχ
и решать часть проблем языка
Αλεχ
но лучше бы их завезли, чем сраный try или там поддержку иероглифов в идентификаторах
պլհկ
https://docs.rs/derive_builder/0.5.1/derive_builder/#default-values
Денис
ну например непонятно, как объявить часть обязательных полей, а часть - нет
необязательное поле == поле, у которого есть дефолтное значение
Vladimir
https://docs.rs/derive_builder/0.5.1/derive_builder/#default-values
Он просто хочет очередной and_then2 не мешай ему
Αλεχ
тем более, что паттерн билдер работает с созданием структуры
Αλεχ
но не работает с методами foo
Sergey
там можно сделать валидацию с паникой, но эт такое
Не надо писать сообщения столбиками!
Αλεχ
Не надо писать сообщения столбиками!
я пишу не столбиками, а быстро
Αλεχ
можешь посчитать среднюю длину сообщения, она не меньше, чем у всех. Так что столбиками никто и не пишет.
Αλεχ
или все пишут.
պլհկ
окей как насчет new(a: i32, b: i32, c: i32 = 10)?
struct Pook { a: i32, b: i32, #[builder(default="10")]c: i32 }
Sergey
Совсем не столбики
Αλεχ
хм.
Αλεχ
действительно не очень. Сорян
Αλεχ
struct Pook { a: i32, b: i32, #[builder(default="10")]c: i32 }
ок, что насчет fn foo(a: i32, b: i32, c: i32 = 10) -> usize ?
Денис
как это с билдерами связано?
Αλεχ
билдеры умеют эту проблему решать (кое-как) в случае инициализации. В случае функций оно уже не работает
Anonymous
play.rust-lang.org
http://play.rust-lang.org/?gist=0578c4ab5c48f6d6e562512d53ada7a3&version=stable&mode=debug&edition=2015
Αλεχ
точнее FooArgsBuilder можно сделать, но это чет говнецо
Денис
http://play.rust-lang.org/?gist=0578c4ab5c48f6d6e562512d53ada7a3&version=stable&mode=debug&edition=2015
возвращаешь ссылку на локальный объект, не надо так
Αλεχ
http://play.rust-lang.org/?gist=0578c4ab5c48f6d6e562512d53ada7a3&version=stable&mode=debug&edition=2015
выше сказали. Локальный объект должен возвращатсья по значению всегда
պլհկ
ок, что насчет fn foo(a: i32, b: i32, c: i32 = 10) -> usize ?
fn foo(a: i32, b: i32, c: Into<Option<i32>>) -> usize { a + b + c.into().unwrap_or(10) }
Cat
ок, что насчет fn foo(a: i32, b: i32, c: i32 = 10) -> usize ?
fn foo_default(a: i32, b: i32) -> usize { foo(a, b, 10) }
Αλεχ
fn foo_default(a: i32, b: i32) -> usize { foo(a, b, 10) }
да, так обычно и делают. 2-3-4 функции.
պլհկ
что неудобно?
Cat
да, так обычно и делают. 2-3-4 функции.
пока не встречал, если честно
Αλεχ
что неудобно?
клиентский код должен в это уметь
Αλεχ
foo(a,b, None, None, None, None, 10, None, None)
պլհկ
что уметь
պլհկ
http://play.rust-lang.org/?gist=1662713eb430834dabf923dd128480d4&version=stable&mode=debug&edition=2015
Αλεχ
internal void SpellCheckString() { string str = "Speling erors here."; object ignoreUpperCase = true; object missingType = Type.Missing; bool blnSpell = ThisApplication.CheckSpelling(str, ref missingType, ref ignoreUpperCase, ref missingType, ref missingType, ref missingType, ref missingType, ref missingType, ref missingType, ref missingType, ref missingType, ref missingType, ref missingType); MessageBox.Show(blnSpell.ToString(), "False if Errors, True if OK"); }
Cat
похоже на петон
Cat
Не знал что i32 имплементит Into Option
по идее всё имплементить должно
պլհկ
Не знал что i32 имплементит Into Option
T имплементит Into<Option<T>>
Cat
^
Αλεχ
vs bool blnSpell = ThisApplication.CheckSpelling(str)
Αλεχ
где остальные параметры подставляются по-умолчанию
Αλεχ
согласен, нужно было бы вместо 22 аргументов юзать структуру как параметр, а уже для неё можно билдер
Αλεχ
но есть и промежуточные вариации
Cat
vs bool blnSpell = ThisApplication.CheckSpelling(str)
SpellingBuilder::new().do().smth().build().check()