代码之家  ›  专栏  ›  技术社区  ›  Imran

如何在Nim中处理选项类型?

  •  3
  • Imran  · 技术社区  · 6 年前

    假设我有一个带签名的函数 proc foo(): Option[int] 然后我设置 var x: Option[int] = foo() .

    如何执行不同的操作取决于 x some none ?

    例如,在Scala中,我可以:

    x match {
      case Some(a) => println(s"Your number is $a")
      case None => println("You don't have a number")
    }
    

    甚至:

    println(x.map(y => s"Your number is $y").getOrElse("You don't have a number"))
    

    到目前为止,我已经想到:

    if x.isSome():
      echo("Your number is ", x.get())
    else:
      echo("You don't have a number")
    

    这看起来不像是好的功能风格。有更好的吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   def-    6 年前

    您可以使用patty来实现这一点,但我不确定它如何与内置选项模块配合使用: https://github.com/andreaferretti/patty

    示例代码:

    import patty
    
    type
      OptionKind = enum Some, None
      Option[t] = object
        val: t
        kind: OptionKind
    
    var x = Option[int](val: 10, kind: Some)
    
    match x: 
      Some(a): echo "Your number is ", a
      Nothing: echo "You don't have a number"
    
        2
  •  1
  •   Imran    6 年前

    我刚刚注意到 options 具有以下步骤:

    proc get*[T](self: Option[T], otherwise: T): T =
      ## Returns the contents of this option or `otherwise` if the option is none.
    

    这就像 getOrElse 在Scala中,因此使用 map get ,我们可以执行类似于我的示例的操作:

    import options
    
    proc maybeNumber(x: Option[int]): string =
      x.map(proc(y: int): string = "Your number is " & $y)
       .get("You don't have a number")
    
    let a = some(1)
    let b = none(int)
    
    echo(maybeNumber(a))
    echo(maybeNumber(b))
    

    输出:

    Your number is 1
    You don't have a number
    
        3
  •  1
  •   georgehu    3 年前

    我的解决方案使用融合/匹配和选项

    import options
    import strformat
    import fusion/matching
    
    proc makeDisplayText(s: Option[string]): string =
      result = case s
        of Some(@val): fmt"The result is: {val}"
        of None(): "no value input"
        else: "cant parse input "