如何在 nushell 中破坏列表

如何在 nushell 中破坏列表

我有hello从模块导出的命令greet。我还定义了main使用该hello命令的命令。这其余参数应传递给hellofrom 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  │
╰───┴────────────╯

相关内容