lens
lens copied to clipboard
Тип "ссылка"
Бывают моменты, когда хочется передать свойство по ссылке, и компилятор логично не дает этого сделать. Или же, нужно написать код наподобие этого:
if(...)
SomeType.SomeData += var.Field;
else if (...)
SomeType.SomeOtherData += var.Field;
else if (...)
SomeType.YetAnotherData += var.Field;
Для решения обоих вопросов можно было бы добавить стандартный тип, например Ref<T>
, хранящий геттер и сеттер с помощью замыканий.
Например, следующий код:
var x = refto SomeType::Value
x = x + 1
Транслировался бы в:
var x = new Ref<int> (-> SomeType::Value) (v -> SomeType::Value = v)
x.Set (x.Get () + 1)
Вариант с сокращенным присваиванием не годится: непонятно, как отличать x
от x.Get ()
- например, при передаче в функцию. Так что оставляет только короткую запись с авто-лямбдами, а методы Get
и Set
оставляем как есть.
Нужно другое ключевое слово вместо refto
- оно слишком близко к ref
.
Кстати говоря, в Scala эта концепция называется Lens :)
http://julien-truffaut.github.io/Monocle/