🔥

Тред (Глеб Лукьянец)


Кстати, про member access operator: dynamicMemberLookup это самое близкое к его перегрузке, что я когда/где-либо видел. Ну в C++ ещё был пропозал про это, но там перегрузка a.b как (&a)->b, для умных ссылок. То есть немного другое.

Суть проблемы заключается в том, что по правую сторону оператора стоит имя поля/метода, которое, само по себе, не является членом первого порядка. Из-за этого выразить такой оператор средствами языка просто невозможно.

Это можно было бы частично пофиксить сделав правую часть чем-то удобоваримым, но я не знаю ни одного языка со статической типизацией, который бы пошел этим путем (кроме swift!)

Как следствие, optional chaining доступен только специально для Optional<T> и больше ни для чего. А жаль: так хотелось добавить его, например, к Result в своем проекте.

Можно было бы предложить ввести некий протокол Unwrappable, поддержав который мы бы получали optional chaining, optional binding и nil-coalescion для любых наших типов. Но я не уверен, что это хороший путь