2016-09-07 4 views
3

Часовня фокусируется на n-мерных массивах и кортежах фиксированного размера. На первый взгляд, как представляется, нет динамических структур данных.Есть ли в Часовне динамические структуры данных?

Одна из особых проблем заключается в том, что вам кажется, что нужно предварительно объявить размер ассоциативных массивов. Карты и словари на других языках не ограничены таким образом.

Есть ли в Чапел более динамичный тип карты/словаря, и я просто пропустил его?

ответ

4

Во-первых, ответ на ваш вопрос - да. Встроенный эквивалент карты/словаря является ассоциативным массивом в Часовне. См. associative arrays primer.

Например, давайте объявим словарь от имени известных людей до их года рождения.

Во-первых, создать домен (то есть множество индексов), который будет содержать имена:

var setOfNames : domain(string); // a domain (set) whose indices are strings 

Тип декларации домена (т), где т некоторый тип, создает ассоциативный домен.

Затем создайте массив над этим доменом, сохраняя целочисленный возраст. Это фактически создает карту из строки -> int.

var nameToBirthYear : [setOfNames] int; 

Чтобы добавить кого-то на съемочной площадке, нам нужно сначала добавить их в домен, а затем установить их год рождения в массиве.

setOfNames.add("Thomas Jefferson"); 
nameToBirthYear["Thomas Jefferson"] = 1743; 

setOfNames.add("Alan Turing"); 
nameToBirthYear["Alan Turing"] = 1912; 

Часовня предназначена для поддержки нескольких массивов в одном домене. Поэтому, если бы мы хотели отдельно узнать место рождения, мы могли бы создать отдельный массив для отслеживания этого.

var nameToBirthPlace : [setOfNames] string; 

nameToBirthPlace["Thomas Jefferson"] = "the Colony of Virginia"; 
nameToBirthPlace["Alan Turing"] = "London, England"; 

Теперь, если мы хотим добавить нового известного человека?

setOfNames.add("Ada Lovelace"); 
// note now that both nameToBirthYear and nameToBirthPlace now have 
// a value for the key "Ada Lovelace". That new element starts out with 
// the default value - so it's 0 and the empty string in this case. 
nameToBirthYear["Ada Lovelace"] = 1815; 
nameToBirthPlace["Ada Lovelace"] = "London, England"; 

В качестве демонстрации мы перейдем к набору индексов и распечатаем связанные элементы массива. (Обратите внимание, что этот цикл будет иметь больше смысла с итерированием на zippered, но я стараюсь, чтобы этот пример был сосредоточен на ассоциативных массивах и доменах).

for name in setOfNames { 
    var birthYear = nameToBirthYear[name]; 
    var birthPlace = nameToBirthPlace[name]; 
    writeln(name, " started out in ", birthPlace, " in the year ", birthYear); 
} 

Обратите внимание, что эти ассоциативные массивы и домены в настоящее время реализованы с помощью hashtables. Возможно создание пользовательской реализации ассоциативного массива или создание пользовательской (не массив) структуры данных для красно-черного дерева или любого необходимого.

В будущем возможно однажды добавить пару ключей, значение непосредственно в ассоциативный массив (без явного упоминания домена массива). 1-D массивы поддерживают такую ​​функцию, когда домен не используется другими массивами - см. array vector operations primer).

+1

Как перебрать ассоциативный массив? Is для (k, v) в zip (x.domain, x) {...} Идиоматический способ? –

+1

Да, (k, v) в zip (x.domain, x) {...} является идиоматическим способом – mppf

Смежные вопросы