lens
lens copied to clipboard
Оператор with
Есть мысль запилить новое ключевое слово with, модифицирующее область видимости. Оно позволит в некоторых случаях сократить дублирование кода. Например:
var tmpVar = doSomething ()
var result = tmpVar.One + tmpVar.Two
Можно будет записать так:
var result = with doSomething () do One + Two
После with может идти как выражение, так и имя класса - тогда будут искаться статические методы и свойства. Например, было бы удобно для перечислений:
var opts1 = RegexOptions::Multiline & RegexOptions::Compiled & RegexOptions::IgnoreCase
var opts2 = with RegexOptions do Multiline & Compiled & IgnoreCase
При конфликтах будет выдаваться сообщение об ошибке компиляции. @ForNeVeR, как тебе мысль?
Скажу честно - я был изначально против такого блока. Но в современных языках есть аналог (import в scala, with в JavaScript и в Pascal). К тому же, я обсудил этот вопрос с коллегами, и был шокирован: они рассматривают такое выражение в качестве допустимого аналога блокам инициализации свойств C#. Так что фиче быть.
Кстати, отличная идея с инициализатором объекта! Я даже не подумал про нее. Но тут есть один тонкий момент: выражение инициализатора свойств возвращает сам объект, и это удобно, чтобы сразу сохранить его в переменную. Но, например, в случае с enum'ами хочется вернуть значение определенного выражения.
Вариант 1: идти по правилам, всегда возвращать значение последнего элемента блока. Тогда инициализатор должен будет вызываться на переменной:
var kitty = new Cat ()
with kitty do
Name = "Darla"
BirthDay = new Date 4 1 2009
CutenessLevel = 9001
Вариант 2: для возвращения последнего значения использовать другую форму. Мне больше всего понравилось ключевое слово make для этого:
var kitty = with new Cat () do
Name = "Darla"
IsCute = true
var result = with kitty make Name.Reverse ()
Вместо make может быть have, return или find - в порядке убывания моего предпочтения.
Чтобы избежать неоднозначности между типом и выражением, можно заюзать уже существующее ключевое слово type:
var mode = with type RegexOptions make CultureInvariant & Multiline & Compiled
Придумал. Можно взять ключевое слово get! Например:
let kitty = with new Cat () do
Name = "Darla"
IsCute = true
let result = with kitty get Name.Reverse ()