Αλεχ
а вот он умеет умножать полосочками
Αλεχ
но не может перемножить числа порядка миллионов с его помощью
Αλεχ
поэтому эти числа тоже плохие
Victor
хм. ну его же не будут пороть прилюдно, а объяснят как лучше сделать. Хотя хз как в нынешних школах с этим.
Anonymous
<.<
Anonymous
обругали как могли, сказали, что так нельзя, но забыли сказать, а как, собственно, можно.
Cuno
Но ты же сам знаешь, как.
Cuno
да, класс - это описание структуры данных и методов работы с ними. Но можно создать класс State, описать в нем свои переменные, передавать в каждую функцию и возвращать из каждой функции в программе State, чтобы хоть как-то эмулировать глобальные переменные
Victor
тут есть нюанс. не обязательно возвращать из каждой функции этот самый стейт. Можно в саму функцию отдавать ссылку на стейт.
Anonymous
В чем разница, кроме того, что кода писать больше и скорость выполнения медленнее?
doc
а ты вообще читал, в чем минусы и плюсы глобальных переменных?
doc
почему этот паттерн так хейтят тут?
Loyd
Ну, строго говоря, речь скорее о мутабельных глобалах. Кешировать всякие regex в lazy_static очень даже правильный подход
Loyd
Мутабельные же глобалы жесть, да. Кроме как какой-нибудь глобальный кеш придумать другое применение сложно
Cuno
а в чем конкретные преимущества этого метода перед глобальными переменными?
Либо так либо ансейф, потому что уследить за глобальным мутабельным состоянием и гарантировать отсутствие гонок данных - нереально.
Anonymous
тут есть нюанс. не обязательно возвращать из каждой функции этот самый стейт. Можно в саму функцию отдавать ссылку на стейт.
кстати, а в Rust можно внутри функции, куда передаешь borowwed mutable, вызвать функцию и передать этот borrowed mutable внутрь? Или как еще можно ссылку при таком раскладе кинуть?
Victor
гонки это уже про многопоточность и вот это вот всё.
Cuno
гонки это уже про многопоточность и вот это вот всё.
Ну так именно из за гонок глобальные мутабельные переменные в расте unsafe.
Anonymous
можно, проверил... Интересно
Victor
Ну так именно из за гонок глобальные мутабельные переменные в расте unsafe.
ну ансейф в расте это одно, но глобальные состояния не только в расте считаются неочень хорошим явлением.
Андрей
кто-нибудь умудрился сделать в расте коннекшен пулл хоть к чему-нибудь без глобального стейта?
Андрей
pool в примере очень глобален)
Cuno
Какое-то у тебя странное представление о глобальных переменных
Андрей
doc
в смысле глобален?) он объявлен как локальная переменная
doc
ты его можешь заинжектить в любой сервис, можешь другой создать
doc
нет глобального состояния
Андрей
а, ну ладно, показалось
Anonymous
mutable borrowing - это глобальное состояние для функций, которые им пользуются
Anonymous
да, через это функции влияют на состояние вызвавших их функций
Loyd
И?
ㅤ
ну допустим embedded
Там глобальный стейт имеет только memory-mapped периферия, всё остальное можно реализовать на стеке без глобал стейта
Anonymous
и я рад, что оно есть =) Те же глобальные переменные, только под видом неглобальных, чтобы любители моды не ругались
պլհկ
по такой логике все mut переменные глобальные
Anonymous
не-а, аргументы функций неглобальны при копировании значения
պլհկ
круто круто
պլհկ
ну вот fn do(a: &mut u32), а - глобальная?
Loo
не-а, аргументы функций неглобальны при копировании значения
что то глобальное - это то что доступное вне зависимости от контекста
Anonymous
да, она позволяет функции изменить значение чего-то вне тела функции
պլհկ
պլհկ
я так и понял, спасибо
Loyd
Ну подождите
Loyd
Дайте ещё послушать, как человек чистоту путает с глобальностью
Anonymous
относительно функции do эта a глобальна
պլհկ
Вон оно как
պլհկ
Относительная глобальность
Anonymous
ну да. А то, что вы называете глобальным, локально для программы и недоступно из другой программы. Или возможно даже из модуля, если оно не объявлено pub
պլհկ
Вот бы ща изобрести собственную терминологию и ввести всех в заблуждение
Anonymous
был бы я не прав - из языков бы удалили возможность делать глобальные переменные и goto в дань моде, раз эта глобальность не та глобальность, можно и так просуществовать
Denis
да, она позволяет функции изменить значение чего-то вне тела функции
Глобальная - это (как я понял) доступная отовсюду. По сигнатуре функции fn do(a: &mut u32) не ясно, откуда доступна a. Ясно только что a доступна для do и для того, кто вызывает do.
John
Почему чувака с глобальными переменными не направили в @rustjerk? Что за дискриминация?
Cuno
был бы я не прав - из языков бы удалили возможность делать глобальные переменные и goto в дань моде, раз эта глобальность не та глобальность, можно и так просуществовать
Тут дело не в моде, а в том, какие программы компилятор может прочекать, а какие нет. Какой код мейнтейнить\понимать\менять проще, а какой сложнее.
Cuno
Направили же.
ㅤ
https://play.rust-lang.org/?gist=225e3a763c166699ae23d7a9084bbd16&version=stable pub struct Meter {} pub struct Phase<'a> { meter :&'a mut Meter } fn main() { let mut m = Meter {}; let mut three_phase_meter = Vec::<Phase>::new(); three_phase_meter.push(Phase { meter: &mut m }); three_phase_meter.push(Phase { meter: &mut m }); three_phase_meter.push(Phase { meter: &mut m }); } error[E0499]: cannot borrow `m` as mutable more than once at a time --> src/main.rs:13:48 | 12 | three_phase_meter.push(Phase { meter: &mut m }); | - first mutable borrow occurs here 13 | three_phase_meter.push(Phase { meter: &mut m }); | ^ second mutable borrow occurs here 14 | three_phase_meter.push(Phase { meter: &mut m }); 15 | } | - first borrow ends here Как можно обойти?
Anton
Он даже вступил туда
Αλεχ
да, она позволяет функции изменить значение чего-то вне тела функции
лол, ну с такими определениями без глобальных переменных действительно ничего не напишешь
Αλεχ
только я рекомендую пользоваться общепринятой терминологией
Αλεχ
чтобы не называть черное белым
ㅤ
🤔
ㅤ
Зачем ты так делаешь?
Есть счётчик, у него может быть либо 1 либо 3 фазы. Каждая фаза должна знать о счётчике, чтобы выдать напряжение на фазе
ㅤ
Могу отрефакторить наоборот — счётчик знает о фазах и выдаёт напряжение на фазе, принимая на вход член енама, описвающего фазы
ㅤ
Точнее, изначально так и было
ㅤ
Решил попробовать хранить фазы в векторе и обращаться по фазам индивидуально, вместо того, чтобы обращаться к счётчику целиком
Anton
Ладно, у меня слишком мало опыта, чтобы подсказывать что-то)
Anton
RefCell в принципе решит твою проблему
Denis
enum Meter { OnePhased(&Phase), ThreePhased { first: &Phase, second: &Phase, third: &Phase } }Я бы как-то так делал
Cuno
Лучше отрефактори. RefCell не бесплатная и небезопасная фигня.
ㅤ
Спасибо за инпут, верну всё как было тогда
Loo
Перестаньте советовать человеку refcell