我有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 │
╰───┴────────────╯