
hello
モジュールからエクスポートされたコマンドがありますgreet
。また、main
このコマンドを使用するコマンドも定義しましたhello
。これ残りのパラメータhello
fromに渡す必要がありますmain
。
hello
実行時にコマンドが続くと予想します$values
。./file.nu one two
╭───┬─────────╮
│ 0 │ one │
│ 1 │ two │
╰───┴─────────╯
しかし、実際の価値は
╭───┬────────────────╮
│ 0 │ [list 2 items] │
╰───┴────────────────╯
#!/usr/bin/env nu
module greet {
export def hello [...values: string] {
echo $values
$values | each { $"Hello ($in)" }
}
}
def main [...names: string] {
use greet hello;
echo (hello $names) | length
}
$names
コマンドを渡す前に破壊する方法はhello
?
答え1
まだない限り(例:@don_amanコメントで言及されています)Nuのリスト拡散演算子は、処理できる残りの引数を持つ関数を設計することをお勧めします。
- 個々のパラメータ(一般的な「休息」ケース)
- 渡された単一リスト(非構造化ケース)
オプション1: 状況を自動的に検出してみてください。これにはコーナーケースがあるかもしれませんが、そうではないかもしれません。
たとえば、次はgreet
正しく処理されます。
[one two three]
(残りのパラメータmain
)その後、内部的に分解されます。greet
four five six
、彼らは単に残りの引数に渡されます。greet
#!/usr/bin/env nu
module greet {
export def hello [...values: string] {
let values = if (($values | length) == 1) and (($values.0 | describe | str substring ',5') == "list<") {
$values.0
} else {
$values
}
$values | each { $"Hello ($in)" }
}
}
def main [...names: string] {
use greet hello;
hello $names
(hello $names) | length
hello four five six
}
> ./greet.nu one two three
╭───┬─────────────╮
│ 0 │ Hello one │
│ 1 │ Hello two │
│ 2 │ Hello three │
╰───┴─────────────╯
3
╭───┬────────────╮
│ 0 │ Hello four │
│ 1 │ Hello five │
│ 2 │ Hello six │
╰───┴────────────╯
オプション2:あるいは、greet
フラグを使用していつ構造を分解するのか、いつ分解するのかを明示的に知ることができます。
#!/usr/bin/env nu
module greet {
export def hello [
--destruct
...values: string
] {
let values = if $destruct {
$values.0
} else {
$values
}
$values | each { $"Hello ($in)" }
}
}
def main [...names: string] {
use greet hello;
hello $names
(hello $names) | length
hello --destruct $names
(hello --destruct $names) | length
hello four five six
}
./greet.nu one two three
╭───┬─────────────────────────╮
│ 0 │ Hello [one, two, three] │
╰───┴─────────────────────────╯
1
╭───┬─────────────╮
│ 0 │ Hello one │
│ 1 │ Hello two │
│ 2 │ Hello three │
╰───┴─────────────╯
3
╭───┬────────────╮
│ 0 │ Hello four │
│ 1 │ Hello five │
│ 2 │ Hello six │
╰───┴────────────╯