为啥 Crystal 不能在初始化程序中推断出这种类型?

Posted

技术标签:

【中文标题】为啥 Crystal 不能在初始化程序中推断出这种类型?【英文标题】:Why can't Crystal infer this type in initializer?为什么 Crystal 不能在初始化程序中推断出这种类型? 【发布时间】:2018-01-28 14:39:48 【问题描述】:

我有以下代码:

class Triangle
  def initialize(@sides : Array(Int32))
    @set = Set.new(@sides)
  end
end

但是我得到了一个编译器错误:

Can't use Set(T) as the type of instance variable @set of Triangle, use a more specific type

因为@sidesArray(Int32) 类型,所以我会认为在片场会有类型推断。我已经阅读了the docs,但没有看到答案。

【问题讨论】:

【参考方案1】:

本质上,实例变量的类型推断不够聪明,无法确定泛型类型。我想这应该是可能的,并且可能会在一段时间内实现,但现在你必须明确地编写它。

【讨论】:

【参考方案2】:

你必须设置集合的类型,像这样:

class Triangle
  def initialize(@sides : Array(Int32))
    @set = Set(Int32).new(@sides)
  end
end

【讨论】:

谢谢,我知道该怎么做,但不明白为什么编译器需要它(这是我的问题)。

以上是关于为啥 Crystal 不能在初始化程序中推断出这种类型?的主要内容,如果未能解决你的问题,请参考以下文章

为啥浏览器可以推断出某些省略的 HTML 元素,但不能推断出形成有效标记所需的所有省略的元素?

为啥方差注释会导致 Scala 无法推断出这种子类型关系?

为啥 Go 编译器不能推断结构实现了接口 [关闭]

为啥 TypeScript 在使用 concat 减少数组时会推断出“从不”类型?

为啥 TS 中的泛型接口不能正确推断类型?

为啥不能快速推断闭包类型