为什么 crystal 的类型推断没有按预期在类上工作?

  • 本文关键字:工作 crystal 类型 crystal-lang
  • 更新时间 :
  • 英文 :


为什么我可以在Crystal:中定义这样的方法

def foo(bar): String
bar.to_json
end
foo({"x" => 1, "y" => 2})

但这种类型推断不适用于类:

class Foo
def initialize(bar)
@bar = bar
end
def foo: String
@bar.to_json
end
end

Foo.new({"x" => 1, "y" => 2}).foo

最后是

Error: can't infer the type of instance variable '@bar' of Foo

关于Crystal的类型推断,我缺少什么?解决方法是什么?

等效的基于类的方法使类成为泛型:

require "json"
class Foo(T)
def initialize(@bar : T)
end
def foo
@bar.to_json
end
end

puts Foo.new({"x" => 1, "y" => 2}).foo

实例变量需要以这样或那样的方式设置它们的类型,因为字典式类型流分析要困难得多,因此对它们进行分析要慢得多。此外,类构建了程序的基础,因此尽可能窄地键入它们不仅使编译器的工作更容易,还使它们更容易使用。对实例变量过于开放的类型限制可能会导致相当长且令人困惑的错误消息。

您可以阅读更多关于引入更改以要求对实例变量进行类型注释的原始提案:https://github.com/crystal-lang/crystal/issues/2390

相关内容

  • 没有找到相关文章

最新更新