Smalltalk - перебирать массив dict с условиями - PullRequest
2 голосов
/ 14 января 2020

Я работаю над небольшим методом Smalltalk, я хочу, чтобы этот метод выполнял итерацию по массиву словаря и возвращал True или False в зависимости от условий.

Массив словаря является переменной экземпляра, имя dictArray .

Это выглядит так: [{'name': toto, 'age': 12}, {'name': tata, 'age': 25}]

Поэтому я хочу перебрать dictArray и проверить для каждого элемента имя и возраст. Если это совпадает, я возвращаю true, иначе false и конец итерации.

В python это должно выглядеть так:

for item in dictArray:
    if item['name'] == aName and item['age'] == aAge:
        return True
return False

Я не могу найти документацию с этим особым случаем ( итерация массива + условие + возврат)

Надеюсь, кто-нибудь может мне помочь!

1 Ответ

5 голосов
/ 15 января 2020

Чтобы проверить, содержит ли Коллекция элемент, соответствующий условию, используйте anySatisfy:. Он отвечает истинно, если есть соответствующий элемент.

dictArray anySatisfy: [:each | (each at: 'name') = aName and: [(each at: 'age') = anAge]]

Ссылка: https://www.gnu.org/software/smalltalk/manual-base/html_node/Iterable_002denumeration.html

Описанный выше способ является предпочтительным способом его записи. Следующее только для объяснения того, как оно относится к вашему примеру кода Python.

anySatisfy: может быть реализовано в терминах do:

anySatisfy: aBlock
   self do: [:each | (aBlock value: each) ifTrue: [^ true]].
   ^ false

или прописано с вашим условием :

dictArray do:
   [:each |
   ((each at: 'name') = aName and: [(each at: 'age') = anAge])
      ifTrue: [^ true]].
^ false

Это эквивалент вашего Python кода.

...