首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sorbet -从泛型类继承时的具体类型

Sorbet -从泛型类继承时的具体类型
EN

Stack Overflow用户
提问于 2019-10-28 23:38:30
回答 1查看 791关注 0票数 0

如何为泛型类型指定String

→ View on sorbet.run

代码语言:javascript
复制
# typed: strict


class NameList < Array
  extend T::Sig

  sig {params(names: T::Array[String]).void}
  def initialize(names)
    names.each { |n| self << n}
  end

  sig {returns(String)}
  def csv
    (map { |n| n.join(',') }).join("\n")
  end
end


nl = NameList.new(['Bruce', 'Clark', 'Peter'])

# Output length of first name.
puts(nl.first&.size)  # String#size
puts(nl.first&.sizee)  # misspelled size - should be an error

# Sorbet-Static output:
# editor.rb:4: Type Elem declared by parent Array must be re-declared in NameList https://srb.help/5036
#      4 |class NameList < Array
#         ^^^^^^^^^^^^^^^^^^^^^^
#     https://github.com/sorbet/sorbet/tree/master/rbi/core/array.rbi#L350: Elem declared in parent here
#      350 |  Elem = type_member(:out)
#             ^^^^^^^^^^^^^^^^^^^^^^^^
# Errors: 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-29 01:24:47

您可以使用

代码语言:javascript
复制
Elem = type_member(fixed: String)

重新声明父代的类型成员已经是必须的(您可以在代码片段上的错误消息中看到,它显示为Type Elem declared by parent Array must be re-declared in NameList),并使用fixed:参数重新声明它,从而允许将该类型参数指定为具体类型。

→ View on sorbet.run

代码语言:javascript
复制
# typed: strict

class NameList < Array
  extend T::Sig

  Elem = type_member(fixed: String)

  sig {params(names: T::Array[String]).void}
  def initialize(names)
    names.each { |n| self << n}
  end

  sig {returns(String)}
  def csv
    (map { |n| n.join(',') }).join("\n")  # Method `join` does not exist on String
  end
end


nl = NameList.new(['Bruce', 'Clark', 'Peter'])

# Output length of first name.
puts(nl.first&.size)
puts(nl.first&.sizee)  # Method `sizee` does not exist on String
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58593924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档