💡

Nim-lang 3項演算子はないけどifが値を持っているのでそれで代替できる

2021/09/08に公開1

nimには3項演算子はないが、if全体が値を返せるのでそれでやっていける。

※小生は、三項演算子の推奨派である。

コードで語る

    var fp: FilePermission = 
        if data.st_uid == posix.getuid():
            fpUserRead
        else:
            if data.st_gid == posix.getgid():
                fpGroupRead
            else:
                fpOthersRead;

ちなみにちゃんとインデントしないと怒られる。

ご覧の有様なので、3項演算子的記述によるコード量のメリットはまるでない。

関数のresultを創る時用の便利機能だと思ったほうが良さそう。

template/macroで書いてる人も要る

nimではtemplate/macroにより、構文拡張が容易なので、演算子を増やしてる人もいる。
これらを使えば、違和感なく手軽に書けるだろう。

Discussion

Double-oxygeNDouble-oxygeN

Nim では else-if ではなく elif が推奨されます.
以下のように書けばインデントは不要です.

var fp = if data.st_uid == posix.getuid(): fpUserRead elif data.st_gid == posix.getgid(): fpGroupRead else: fpOthersRead

ワンライナーが読みにくい場合は次のように書くのも良いかもしれません.

var fp = if data.st_uid == posix.getuid(): fpUserRead
  elif data.st_gid == posix.getgid(): fpGroupRead
  else: fpOthersRead

ご参考までに.