lens icon indicating copy to clipboard operation
lens copied to clipboard

Тип "ссылка"

Open impworks opened this issue 10 years ago • 2 comments

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

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)

impworks avatar May 27 '14 12:05 impworks

Вариант с сокращенным присваиванием не годится: непонятно, как отличать x от x.Get () - например, при передаче в функцию. Так что оставляет только короткую запись с авто-лямбдами, а методы Get и Set оставляем как есть.

Нужно другое ключевое слово вместо refto - оно слишком близко к ref.

impworks avatar Jun 18 '17 13:06 impworks

Кстати говоря, в Scala эта концепция называется Lens :)

http://julien-truffaut.github.io/Monocle/

impworks avatar Oct 03 '17 13:10 impworks