간단히 말해서 목록을 파괴하는 방법

간단히 말해서 목록을 파괴하는 방법

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

관련 정보