微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Crystal 的类型推断不能按预期在类上工作?

如何解决为什么 Crystal 的类型推断不能按预期在类上工作?

为什么我可以在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。