erg/doc/JA/syntax/17_narrowing.md
2023-03-29 21:59:28 +09:00

2.4 KiB

型の絞り込み

Ergでは条件分岐による型の絞り込み(narrowing)ができます。

x: Int or NoneType
y = x + 1 # TypeError

xの型はInt or NoneTypeです。Noneである可能性があるため、x + 1は型エラーになります。

if x != None, do:
    x + 1 # OK
    ...

しかし、上のようにxNoneでないことを条件分岐で確認することで、xの型はIntに絞り込まれます。 isinstance演算子でも同様のことができます。

if isinstance(x, Int), do:
    x + 1 # OK
    ...

絞り込み効果を発生させる関数・演算子

現在のところ、絞り込みの効果を発生させる関数・演算子は以下のものに限られます。

in

x in Tという式は、xTのインスタンスであるかどうかを判定します。 これがTrueとなった場合、絞り込みを使うサブルーチンで効果を発揮します。

x: Int or Str
if x in Int, do:
    x + 1 # OK
    ...

notin

inと逆の意味を持ちます。

isinstance

x in Tと似ていますが、型が単純なクラスである場合にのみ使えます。

x in 1.. # OK
isinstance(x, 1..) # TypeError
isinstance(x, Int) # OK

==/is!

x == yないしx is! yという式は、xyに等しいかどうかを判定します(両者の違いはAPIのドキュメント等を参照してください)。

!=/isnot!

==/is!と逆の意味を持ちます。

>=/>/<=/<

絞り込みによって篩型のメソッドが使えるようになる場合があります。

i: Int
if i >= 0, do:
    log i.times! # <bound method ...>

絞り込み効果を消費する関数・演算子

if/if!/while!は引数に渡したブロック内でのみ絞り込みが発生します。 スコープを抜けると絞り込みは解除されます。 assertの場合は、assert呼び出し以降のブロック内でのみ絞り込みが発生します。

if/if!

x: Int or Str
if x in Int, do:
    x + 1 # OK
    ...

while!

x: Int! or NoneType
while! do x != None, do!:
    x.inc!() # OK
    ...

assert

x: Int or NoneType
assert x != None
x: Int

Previous | Next