kitsu
Но при этом мувать нельзя?
лучш сделай пример и компилятор тебе все сам расскажет
Cat
https://play.rust-lang.org/?gist=2f5ed9f85e0ee2ef7bcc6a6e614cb1fa&version=stable&mode=debug&edition=2015
Anton
Ага, ясно
Anton
Только непонятно, почему он предлагает юзать ref b. Там же будет &&T
Cat
не будет
Cat
в этом и смысл
Anton
https://play.rust-lang.org/?gist=35fa7e886ba78333b606a509af195060&version=stable&mode=debug&edition=2015
Anton
expected i32, found &&A
Cat
это конечно здорово, но зачем тогда в принципе делать match a { ref b ... }?
Anton
Если ты отдаёшь значение, а тебе нужна ссылка внутри
Anton
При этом он всё равно мувнет, как я понимаю
Cat
я говорю
Cat
зачем делать fn test(s: i32) {} fn main() { let a = &A{}; match a { ref b => test(b) } } если можно сделать fn main() { let a = &A{}; test(a) }
Anton
Нет, не мувает всё-таки
Anton
Не знаю. Мы же не конкретный кейс разбираем
Cat
тогда пример не репрезентативен
Anton
Да
Anton
Короче я снова стал меньше понимать. Потому что я думал, что мув определяется только выражением под match
Cat
что для тебя мув?
Anton
А выходит, что паттерны тоже влияют
Anton
Ну типа я пишу match a { ... }, после этого a недоступна
Cat
на мув влияют только функции, и их аргументы
Anton
А выходит, что это зависит от того, что в { ... }
Anton
https://play.rust-lang.org/?gist=5c843285bc12e88845167b1905b054da&version=stable&mode=debug&edition=2015
Cat
после скоупа match
Anton
Вот тут если поменять местами, то компилируется
Anton
Хотя отличие только в паттерне
Anton
То есть мув a происходит, если он есть хотя бы в одном из паттернов
Anton
Вот это всё не сразу как-то очевидно новичкам
Anton
То есть мне)
Cat
у тебя просто match'и странные
Cat
не нужно писать match a { b => ... } потому что это не несёт смысла
Anton
Ну этот пример важен для понимая того, как match работает
Cat
нет, он не встречается почти никогда
Cat
матч нужен когда тебе нужно сделать какие-то операции в зависимости от значения
Cat
а писать match a { b => ... } всё равно, что писать if a == a { ... }
Anton
Я сейчас про то, что когда я в коде вижу, что какое-то значение передаётся в match, мне недостаточно посмотреть, стоит ли перед ним & или нет, чтобы понять мувнется оно или нет
Anton
Нужно ещё в паттерны смотреть
Cat
что такое "мувнется"?
Cat
если это ссылка, то оно никуда не мувнется
Anton
Когда это не ссылка
Cat
Когда это не ссылка
тогда это компайл тайм эррор
Cat
если ты после мува используешь ещё раз
Anton
Я понимаю
Cat
(если тип реализует Copy, то в случае надобности возмётся копия)
Anton
Ты не о том говоришь
Cat
Я понимаю
я просто не понимаю юзкейс
Anton
https://play.rust-lang.org/?gist=5c843285bc12e88845167b1905b054da&version=stable&mode=debug&edition=2015
Вот здесь два матча. Если не заглядывать внутрь { }, они одинаковы: match a. При этом в одном случае move происходит, а в другом нет
Anton
Значит, чтобы мне понять, будет он происходить или нет, нужно все паттерны проверить
Anton
Я просто говорю, что для меня это было неочевидным
Anton
Я думал, что если я пишу match a, то a мувнется, а если пишу match &a, то нет
Cat
ааааа, до меня дошло
Cat
anyway, пример очень плохой
Cat
так никогда не делают
Anton
https://play.rust-lang.org/?gist=8fea64706730a2213690ac2c8f9c64d0&version=stable&mode=debug&edition=2015
Anton
Так лучше?)
Cat
Так лучше?)
так лучше
Anton
так лучше
Чем этот пример лучше, если тут нет сравнения?)
Cat
зачем два матча?
Anton
Чтобы показать, что у них разная семантика
Cat
ну, тем этот пример и лучше
Cat
это не пример того, какая разница между & и ref, но того, что второй матч не нужен
Anton
Ладно, я понял, что ты о чём-то своём споришь)
Cat
я говорю о том, что в жизни ты не увидишь два матча подряд
Cat
поэтому их проблема надумана
Cat
если тебе нужно использовать значение после матча (которое перемещается), в матче делаешь всё по ссылке и не паришься
Anton
я говорю о том, что в жизни ты не увидишь два матча подряд
Они могут быть вообще в разных частях кода. Тут они подряд просто так идут
Cat
да, я понимаю, но, к сожалению, это влияет на семантику
Cat
короче пофигу, можем сойтись на том, что я слился
Victor
Ребят, привет. есть вакансия для rust программиста в Петербурге. тут можно выложить?
Anton
https://play.rust-lang.org/?gist=dd1f9350a0fd5722d4ab9a32d21e02c6&version=stable&mode=debug&edition=2015
Anton
Cat
энивей, если нужно использовать значение A два раза, то в каком-то месте придётся копировать
Cat
в общем, ладно, аргументы с моей стороны дествительно странные