是否可以破坏Nim中的序列?

问题描述

是否可以在Nim中获得前N个元素?像这样:

let [a,b,...rest] = "a/b/c".split("/")

P.S。

用例我试图解析“ NYSE:MSFT”字符串

proc parse_esymbol*(esymbol: string): tuple[string,string] =
  let parts = esymbol.split(":")
  assert parts.len == 2,fmt"invalid esymbol '{esymbol}'"
  (parts[0],parts[1])

echo parse_esymbol("NYSE:MSFT")

解决方法

您可以像这样从元组分配变量:

let (a,b) = ("a","b")

没有内置的将元组转换为seq的方法,但是您可以使用这样的小宏来做到这一点:

macro first[T](s:openArray[T],l:static[int]):untyped =       
  result = newNimNode(nnkPar)
  for i in 0..<l:            
    result.add nnkBracketExpr.newTree(s,newLit(i))   


let (a,b) = "a/b/c".split('/').first(2)
,

目前至少有两个库实现了this answer中的宏,例如unpackdefinesugar

import strutils

import unpack

block:
  [a,b,*rest] <- "a/b/c/d/e/f".split("/")
  echo a,b
  echo rest

import definesugar

block:
  (a,*rest) := "a/b/c/d/e/f".split("/")
  echo a,b
  echo rest

# output for both
# ab
# @["c","d","e","f"]

最近的讨论:https://forum.nim-lang.org/t/7072

但是对于您的特定用例,我将使用https://nim-lang.github.io/Nim/strscans.html