代码之家  ›  专栏  ›  技术社区  ›  Alex Craft

如何在Nim中声明可为null的字段?

  •  0
  • Alex Craft  · 技术社区  · 4 年前

    这个 stock_symbol 是可选的,它只存在于某些公司,在Nim中声明它的正确方式是什么?

    我一定要用吗 ref 或者还有别的办法?

    type
      Company = object
        name:         string
        stock_symbol: string
    
    echo Company(name: "Microsoft", stock_symbol: "MSFT")
    echo Company(name: "Kinetic",   stock_symbol: nil)
    

    而对于复合型的类似问题,通常你需要同时知道证券交易所和符号

    type
      SymbolWithExchange = object
        exchange: string
        symbol:   string
    
      Company2 = object
        name:         string
        stock_symbol: SymbolWithExchange
    
    echo Company2(
      name:         "Microsoft", 
      stock_symbol: SymbolWithExchange("NYSE", "MSFT")
    )
    echo Company2(name: "Kinetic",   stock_symbol: nil)
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   Alex Craft    4 年前

    好像 Option[T] 应使用

    import options
    
    type
      Company = object
        name:         string
        stock_symbol: Option[string]
    
    echo Company(name: "Microsoft", stock_symbol: some("MSFT"))
    echo Company(name: "Kinetic",   stock_symbol: none(string))
    

    import options
    
    type
      SymbolWithExchange = object
        exchange: string
        symbol:   string
    
      Company2 = object
        name:         string
        stock_symbol: Option[SymbolWithExchange]
    
    echo Company2(
      name:         "Microsoft", 
      stock_symbol: some(SymbolWithExchange(exchange: "NYSE", symbol: "MSFT"))
    )
    echo Company2(name: "Kinetic",   stock_symbol: none(SymbolWithExchange))
    
        2
  •  3
  •   Gibus    4 年前

    使用“options”模块是可能的,但我发现它带来的问题比它解决的问题要多,因为您需要将输入作为some()进行排序,如果您正在构建一个库或者其他人将使用这个库,那么这个要求可能是一个大问题。

    在您的例子中,我建议使用构造函数初始化值。

    type
      Company = object
        name:         string
        stock_symbol: string
    
    proc company_constructor(name: string, stock_symbol: string = ""): Company =
      return Company(name:name, stock_symbol:stock_symbol)
    
    let
      company_a = company_constructor("Microsoft", "MSFT")
      company_b = company_constructor("Kinetic")
    
    echo company_a
    echo company_b 
    

    输出:

    (name: "Microsoft", stock_symbol: "MSFT")
    (name: "Kinetic", stock_symbol: "")
    
    推荐文章