簡単に言えば、リストを破壊する方法

簡単に言えば、リストを破壊する方法

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

おすすめ記事