Nimのiteratorの使い方

概要

Nimのiteratorの使い方を下記にまとめる

ソースコード

github.com

1行目~3行目

type Animal = object
  name: string
  age: int

Animalを定義。

要素は2つで、nameとageのみ。

5行目~6行目

type AnimalBox = object
  animals: seq[Animal]

AnimalBoxを定義。

要素は1つでAnimal 型のsequenceをanimalsとして所持する。

8行目~13行目

iterator eachName(box: AnimalBox): string = 
  let length = box.animals.len
  var i = 0
  while i < length:
    yield box.animals[i].name
    inc i

eachNameというiteratorをAnimalBoxに取り付ける。

Nimではiteratorを定義する時iteratorと書く。

非常にわかりやすい。

この例では、animalsのnameを1つずつ取り出すiteratorを定義。

15行目~20行目

iterator eachNameAndAge(box: AnimalBox): tuple[a: string, b: int] = 
  let length = box.animals.len
  var i = 0
  while i < length:
    yield ( box.animals[i].name, box.animals[i].age )
    inc i

2つめのiteratorを定義。

今度は、nameとageのtupleを1つずつ取り出す。

22行目~35行目

let dog = Animal(name: "dog", age: 5)
let cat = Animal(name: "cat", age: 4)
let bird = Animal(name: "bird", age: 3)
let animalBox = AnimalBox(animals: @[dog, cat, bird])

echo "animalBox.eachName:"
for name in animalBox.eachName():
  echo name

echo ""

echo "animalBox.eachNameAndAge:"
for pair in animalBox.eachNameAndAge():
  echo pair

AnimalBoxにとりつけた、iteratorを使用する。

可読性が高く使いやすい。

出力結果

animalBox.eachName
dog
cat
bird

animalBox.eachNameAndAge
(a: "dog", b: 5)
(a: "cat", b: 4)
(a: "bird", b: 3)