Nim

Nimのdocoptでコマンドライン引数をnilと表示されて戸惑った

nimでtodoリストのコマンドラインツールを作ろうと思い、
docoptをimportして以下のように記述していました。

# docopt用のコマンドライン引数定義
const doc = """
Usage:
    tdnim <action> [<content>] [-l: --label]

Options:
    <action>    ToDo Action
    <content>   ToDo Content
    -l --label  ToDo Label Option
"""

# モジュールのインポート
import system
import docopt

proc main =
    let
        args = docopt(doc, version = "1.0.0")
        action: string = $args["<action>"]
        content: string = $args["<content>"]
                                                                                                                                                        
echo action
echo content

main()

そして以下のように実行しました。
(2つ目のコマンドライン引数無しの状態)

$ nim c tdnim.nim
$ ./tdnim init

するとecho contentの部分でnilと出力された様子。
あれ?stringの未定義の初期値はnilから空文字””へ0.19.0で変更された
はずだったような…。nil checkが必要?
そこで下記公式レファレンスに乗っているisNilのプロシージャで
チェックしてあげればよいだろうと思って勢いでisNil。

if content.isNil:
  echo "content is nil."
else :
  echo content

user-defined error.
まあそりゃそうですよね。Optionalじゃないもの。isNilなんて無い…。

で結論なんだったかというと、
docoptで引数が取れない場合の返却値は”nil”の文字列でした。
やられた…。

if content == "nil":
  echo "content is nil."
else: 
  echo content

うーん、これIssueにあげようかな、と思ったらあった…。
とりあえず当面は文字列でチェックかな。

https://github.com/docopt/docopt.nim/issues/22
https://github.com/docopt/docopt.nim/pull/25

カテゴリー: Nim
投稿を作成しました 4

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連する投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る