July 16, 2009

Немного об инициализации коллекций

Читаю сейчас Foundations of F# (тут можно почитать). И вот в главе про императивное программирование наткнулся на интересный способ инициализации коллекций.

Часто бывает так, что надо создать список/словарь/whatever и тут же наполнить его какими-нибудь элементами.

let myList = new System.Collections.Generic.List<int>()
myList.Add(1)
myList.Add(2)
myList.Add(3)

Да, я знаю что можно написать короче, например:

let myList = new System.Collections.Generic.List<int>()
[1;2] |> Seq.iter myList.Add

Но не об этом сейчас разговор. Проблема в том, что такой код мозолит глаза инициализацией за несколько операций. Не могу сказать, такая ли уж это проблема, но чувствую, что что-то не так. ;-)

И вот какое решение предлагается:

let myList =
let temp = new System.Collections.Generic.List<int>()
temp.Add(1)
temp.Add(2)
temp.Add(3)
temp

То есть, вроде бы и функция, но вычисляется один раз, то есть по сути значение. Очень, кстати, похоже на инициализаторы коллекций в свежем C#.

var myList = new System.Collections.Generic.List<int>() { 1, 2, 3 };

Красота?


This page is powered by Blogger. Isn't yours?