【问题标题】:How to specify type parameter如何指定类型参数
【发布时间】:2019-11-04 16:04:15
【问题描述】:

如何使用 sorbet 指定类型参数?

例如,我想使用返回泛型类型T[A]A 类型的参数来注释一个方法。

def build_array(value) 
  [value]
end

输出类型取决于输入类型:

build_array(42) #=> return Array[Integer]
build_array('42') #=> return Array[String]

【问题讨论】:

    标签: ruby sorbet


    【解决方案1】:

    您可以尝试使用 Generic 来定义方法。

    例如:

      sig do
        type_parameters(:U)
        .params(
          blk: T.proc.params(arg0: Elem).returns(T.type_parameter(:U)),
        )
        .returns(Box[T.type_parameter(:U)])
      end
      def map(&blk)
        Box.new(blk.call(@x))
      end
    

    参见sorbet.run的示例

    【讨论】:

    • 谢谢!更新。 @aysamanra 通过工作示例提供了更好的答案。向他致敬。
    【解决方案2】:

    您可以使用type_parameters 完成此操作:

    # typed: true
    extend T::Sig
    
    sig do
      type_parameters(:T)
      .params(value: T.type_parameter(:T))
      .returns(T::Array[T.type_parameter(:T)])
    end
    def build_array(value) 
      [value]
    end
    
    x = build_array(5)
    T.reveal_type(build_array(42))   # T::Array[Integer]
    T.reveal_type(build_array('42')) # T::Array[String]
    

    这是sorbet.run link with the above code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 2011-11-26
      • 2023-03-04
      • 2011-02-04
      相关资源
      最近更新 更多