crystal-lang - 为什么 Crystal 无法推断实例变量的类型?

标签 crystal-lang

为什么此代码对实例变量失败?

a = 4.days # Works
class A
  @a = 4.days # Fails
end
附言
future 有没有改进的计划?似乎是很普通也很有用的东西。

最佳答案

@a = 4将作为 4 工作是 literal ,但是 4.days是一个表达式,因此不能自动推导出。出于同样的原因 @a = 1 + 1 also requires explicit types ,即使 @a = 2不会。
关于 future 的计划,有趣的是该功能存在,但被有意删除。
简而言之,原因是保持编译步骤简单。自动引入类型很优雅,但也有缺点:

  • 编译较慢
  • 为错误类型的程序生成好的错误消息变得困难
  • 重用以前编译的结果变得困难(或不可能?)

  • 原因是,通常,您必须分析整个源代码中的函数调用链。请注意,并非所有表达式都像 1 + 1 一样简单.偶4.days已经有些复杂了,因为编译器需要推导出 days 的返回类型方法调用。
    如果您想了解有关设计决策的更多信息,我建议您阅读 discussion from 2015 .
    你可能会问,为什么它适用于课外的第一个作业?我认为在这种情况下,上下文更加本地化。因此,反对允许它的论据并不完全适用。例如,如果您更改函数内部的语句,其效果不像更改类的布局那样具有全局性。
    再次,这是一种权衡。但是这两种情况下的强制类型都会彻底改变体验。虽然在类的上下文中影响相当小,但强制任何赋值的显式类型会将“类似 Ruby”的 Crystal 语言变成传统的类型化语言,其中每个赋值都需要显式键入。

    关于crystal-lang - 为什么 Crystal 无法推断实例变量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68750438/

    相关文章:

    linux - Linux 上缺少标准库?

    dependencies - 如何生成没有依赖项的 Crystal 可执行文件?

    crystal-lang - 为什么Crystal不能解析1+1赋值的类型?

    crystal-lang - Crystal lang,是否可以在不等待GC的情况下显式处置(免费)实例(对象)?

    static-variables - Crystal 静态变量

    macos - ld : library not found for -lssl

    crystal-lang - 如何测试私有(private)方法?

    crystal-lang - Crystal 中的网页抓取库

    crystal-lang - 如何配置JSON.mapping让Array of Strings Array变成Hash?

    ruby - 为什么 Crystal 比 Ruby 快?