Alex
даже у Go был больше промежуток вроде как.
Andrey
не следил подробно, но Go?
պլհկ
го хайпится только последний год
Alex
Но Go больше лет.
պլհկ
ну ок, пусть 2 года
Alex
и он проще.
Anonymous
чё?
Ну, вторая строка — типа в блоке?
պլհկ
а ему 7 лет
Alex
а еще он проще.
доня.
просто создаётся новая переменная
доня.
с таким же именем
Anonymous
wtf? =)
доня.
это и называется затенение
Alex
wtf? =)
у тебя в блоке есть переменная x, и снаружи есть переменная x.
Alex
что нет?
Anonymous
Я думал, такое можно делать только в блоке, если есть переменная снаружи.
доня.
что нет?
я же ему говорю, в моём примере нет никакого блока
Alex
а, ну в твоем нету да.
Anonymous
Охохо
Alex
я кстати к приведению типов через затенение сам пришел, просто попробовал можно ли так делать или нет. Оказалось можно.
Anonymous
И толку тогда от иммутабельности, если переменную можно затенить в том же блоке, где она объявлена? о.0
Alex
Обычно в расте если задаешь вопрос "можно ли так делать" то чаще ответ нет чем да.
Alex
старая то не мутировалась
Alex
старую переменную никто не мутировал
Anonymous
Чёрт. =)))
Anonymous
Ну это понятно.
Alex
т.е у тебя в реальной памяти как было какое то значение, так оно там и сидит
Anonymous
Но высокоуровневый смысл в том, что ты пишешь мутабельный эээ код. =)
Alex
Вроде сразу как переменная уходит, освобождается память
Alex
но тут лучше спросить тех кто получше шарит.
доня.
попробуй на таком мутабельном коде цикл организовать
Alex
высокоуровневый смысл нужен только программисту
Anonymous
Ну, я не парился над формулировкой.
доня.
затенять нельзя там по условию или в цикле
доня.
и нельзя изнутри блока менять/затенять/... то что снаружи
доня.
т.е.
Alex
менять вроде можно, не?
Alex
ток оно перемещается
доня.
let mut x = 0; for i in 0..10 { x += 1; // всё норм } против let x = 0; for i in 0..10 { let x = x + 1; // затенённое значение остаётся внутри блока }
Anonymous
менять вроде можно, не?
Я думаю, что если переменная мутабельна, то ей можно изменить изнутри вложенного блока.... Но это сайд-эффект. И было бы странно.
доня.
в первом варианте мутабельность, во втором - затенение
Alex
или скок там
Anonymous
Ничего не имею против затенения внешних переменных. Но с затенением переменных на том же уровне будет сложно смириться.
Alex
поменял - владение передал
Alex
либо по ссылке отредачил, но это тоже норм
Anonymous
поменял - владение передал
Вот с пониманием этого проблемы пока.
Alex
Вот с пониманием этого проблемы пока.
ну ты когда читаешь внутри блока - ты уже передал владение, если только не по ссылке читаешь
Alex
https://github.com/Fedcomp/rconcmd/blob/master/src/srcds/rcon/packet.rs#L52 Вот пример
Alex
осторожно, нубокод
доня.
@bigslycat понимаешь, разницы между следующими кусками кода семантически нет, только во втором случае ты уже не можешь использовать старые значения после затенения: let x0 = foo(); let x1 = x0.bar(); let x2 = x1.baz(); и let x = foo(); let x = x.bar(); let x = x.bax();
Alex
опасно для жизни.
Alex
в общем я тоже думал что затенение вредно, пока сам не столкнулся.
Alex
Теперь я обожаю эту штуку, ОСОБЕННО в статически типизированных языках.
Alex
иначе был бы геморой вроде net_type = , net_type1 =
Anonymous
Ну, если говорить о JS, то у меня там линтер запрещает: 1) Юзать мутабельные переменные, если значение никем не меняется. Да и кейс мутабельности просто почти отсутствует. 2) Затенять переменные. Создавай переменную с другим именем. Иначе потом запутаешься. 3) Если, не дай Бог, затеняешь, делай это вначале блока, чтобы было видно. И только в том случае, если нигде не используешь значения затеняемых переменных. В жс термина "затенение" нет, но он очень удобный. =)
Cuno
По 1 пункту компилятор warning выдает.
Anonymous
Это типа агрегированный опыт, полученный от кривой архитектуры языка.
Alex
если говорить о js, то это другой язык
Anonymous
И тогда можно жить.
Anonymous
Anonymous
И, т.е. let x = foo(); let x = x.bar(); let x = x.bax(); Это безопасный код?
Anonymous
Ой.
Alex
что значит безопасный?
Anonymous
Чисто гипотетически.
Alex
в расте все что не unsafe - безопасно )