switch式のサポート

投稿日: Mar 19, 2009 2:35:47 PM

R4.1ではレガシー言語にあわせて、switch caseの表現をサポートしています。

1 switch

    when: 1 do: [10];

    when: 2 do: [20];

    when: 3 do: [30];

    default: [#hello].

式なので、値を受け取り可能です。

ret := 123 switch

        when: [:s | s < 0] do: [:v | v*1];

        when: [:s | s > 1000] do: [:v | v*2];

        when: [:s | s = 123] do: [:v | v*3];

        default: [:v | v*4].

この場合はretの値は369となります。

クラスでマッチさせることもできます。

ret := #auau switch

        class: Object do: [10];

        kind: String do: [20];

        class: Number do: [30].

retは20となります。

do:の後はセレクタとなるシンボルを使うこともできます。targetでメッセージの送り先を指定できます。指定のない場合はオリジナルのレシーバが送り先となります。

ret := 1 switch

        when: 1 do: #printString;

        when: 2 do: #class;

        when: 3 do: #negated;

        default: #abs.

retは'1'です。

ret := 1 switch target: 3;

        when: 1 do: #printString;

        when: 2 do: #class;

        when: 3 do: #negated;

        default: #abs.

retは'3'です。

なかなか便利でしょう!?