6.32. kink/container/MAP

6.32.1. map型

mapは、キー/値のコンテナの抽象型である。

map中のキーは、キーの同値関係において一意でなければならない。

キーの同値関係

キーの同値関係equivalent-toは、キーの定義域内のすべてのX, Y, Zについて、次の条件を満たさなければならない。

• 反射律: X equivalent-to X

• 対称律: (if X equivalent-to Y then Y equivalent-to X) and (if not (X equivalent-to Y) then not (Y equivalent-to X))

• 推移律: if X equivalent-to Y and Y equivalent-to Z then X equivalent-to Z

6.32.1.1. Map.eq

eqは、Mapのキーの同値関係の関数を戻す。

結果の関数$equivalent_to?は、ふたつの引数X, Yを取る関数である。 `equivalent_to?(X Y)` は、 `X equivalent-to Y` のbool値を戻す。ここで `equivalent-to` は、Mapのキーの同値関係である。

6.32.1.2. Map.get(Key ...[$if_absent])

getは、Keyに同値なキーに関連付けられた値を戻す。

Mapがそのようなキーを持っていない場合、getは、$if_absentを末尾呼び出しする。$if_absentのデフォルト値は、例外を投げる関数である。

事前条件

Keyはキーの同値関係の定義域に含まれなければならない。

$if_absentはサンクでなければならない。

:FLAT_MAP.require_from('kink/container/')

:Map <- FLAT_MAP.of('one' 1 'two' 2 'three' 3 'four' 4)
stdout.print_line(Map.get('one').repr)  # => 1
stdout.print_line(Map.get('five'){ 'big' }.repr) # => "big"

Map.get('five')
# Output:
#   ...
#   -- main exception
#   ,,,
#   {builtin:kink-mods/kink/container/FLAT_MAP.kn L138 C9 raise} { -->raise('{}: no such key: {}'.format(Desc Key.repr)) }
#   Flat_map.get(Key ...[$if_absent]): no such key: "five"

6.32.1.3. Map.get_opt(Key)

MapがKeyに同値なキーを持っている場合、get_optは、[Val]を戻す。ここでValは、そのキーに関連付けられた値である。

Mapがそのようなキーを持っていない場合、get_optは[]を戻す。

事前条件

Keyはキーの同値関係の定義域に含まれなければならない。

:FLAT_MAP.require_from('kink/container/')

:Map <- FLAT_MAP.of('one' 1 'two' 2 'three' 3 'four' 4)
stdout.print_line(Map.get_opt('one').repr)  # => [1]
stdout.print_line(Map.get_opt('five').repr) # => []

6.32.1.4. Map.have_key?(Key)

have_key?は、Mapが、Keyに同値なキーを持っているかどうかを戻す。

事前条件

Keyはキーの同値関係の定義域に含まれなければならない。

:FLAT_MAP.require_from('kink/container/')

:Map <- FLAT_MAP.of('one' 1 'two' 2 'three' 3 'four' 4)
stdout.print_line(Map.have_key?('one').repr)  # => true
stdout.print_line(Map.have_key?('five').repr) # => false

6.32.1.5. Map.size

sizeは、Mapに含まれるキー/値ペアの数を、整数のnum値として戻す。

6.32.1.6. Map.any?

any?は、Mapが1個以上のエントリを含んでいるかどうかを戻す。

6.32.1.7. Map.set(Key Val)

setは、Keyをキーとして、Valを値として関連付ける。

MapがKeyと同値のキーを持っていない場合、setはKeyとValの間に新しい関連付けを作る。

MapがKeyと同値のキーをすでに持っている場合、setはその関連付けをValで上書きする。その場合、setは関連付けをKeyで上書きするかもしれないし、古いキーを持ち続けるかもしれない。

事前条件

Keyはキーの同値関係の定義域に含まれなければならない。

事後条件

Map.have_key?(Key)はtrueになる。

Map.get(Key)はValになる。

:FLAT_MAP.require_from('kink/container/')

:Map <- FLAT_MAP.of('one' 1 'two' 2 'three' 3)
Map.set('four' 4)
Map.set('one' 'ONE')
stdout.print_line(Map.repr) # => (flat_map "four"=>4 "one"=>"ONE" "three"=>3 "two"=>2)

6.32.1.8. Map.pop_at(Key)

pop_atは、キーがKeyと同値であるキー/値ペアを削除して、関連付けられた値を戻す。

事前条件

Keyはキーの同値関係の定義域に含まれなければならない。

事後条件

Map.have_key?(Key)はfalseになる。

:FLAT_MAP.require_from('kink/container/')

:Map <- FLAT_MAP.of('one' 1 'two' 2 'three' 3 'four' 4)
stdout.print_line(Map.pop_at('four').repr) # => 4
stdout.print_line(Map.repr) # => (flat_map "one"=>1 "three"=>3 "two"=>2)

6.32.1.9. Map.clear

clearは、すべてのキー/値ペアをMapから削除する。

6.32.1.10. Map.key_iter

key_iterは、キーのiterを戻す。

:FLAT_MAP.require_from('kink/container/')

:Map <- FLAT_MAP.of('one' 1 'two' 2 'three' 3 'four' 4)
Map.key_iter.each{(:K)
  stdout.print_line(K.repr)
}
# Output:
#   "four"
#   "one"
#   "three"
#   "two"

6.32.1.11. Map.pair_iter

pair_iterは、すべてのキー/値ペアについてのvec=[Key Value]のiterを戻す。

:FLAT_MAP.require_from('kink/container/')

:Map <- FLAT_MAP.of('one' 1 'two' 2 'three' 3 'four' 4)
Map.pair_iter.each{([:K :V])
  stdout.print_line('{} => {}'.format(K.repr V.repr))
}
# Output:
#   "four" => 4
#   "one" => 1
#   "three" => 3
#   "two" => 2

6.32.1.12. X == Y

== 演算子、またはop_eqメソッドは、ふたつのmap、XとYが同値であるかどうかを戻す。

ふたつのmapは、次の条件が満たされるときに同値である。

• XとYが同値なkeyの集合を持っている。

• XのそれぞれのキーKについて、X.get(K) == Y.get(K)がtrueである。

事前条件

Yはmapでなければならない。

XとYのキーの同値関係は同一でなければならない。

XとYの値は、 == 演算子で相互に比較できなければならない。

6.32.2. MAP.is?(Val)

is?はValがmapであるかどうかを戻す。

6.32.3. MAP.mixin

mixinは、下記のmapのメソッドのデフォルト実装を提供するミックスイントレイトを戻す。

• get

• have_key?

• any?

• key_iter

• op_eq / `==` 演算子