crystal-lang - 为什么 Crystal 无法推断实例变量的类型?
问题描述
为什么此代码对实例变量失败?
a = 4.days # Works
class A
@a = 4.days # Fails
end
附言
未来有没有改进的计划?似乎是很常见和有用的东西。
解决方案
@a = 4
会像文字一样工作,但它4
是一个表达式,因此不能自动推导出来。出于同样的原因,还需要显式类型,即使不需要。4.days
@a = 1 + 1
@a = 2
关于未来的计划,有趣的是该功能存在,但被有意删除。
简而言之,原因是为了保持编译步骤简单。自动归纳类型很优雅,但也有缺点:
- 编译速度较慢
- 为错误类型的程序生成好的错误消息变得很困难
- 重用以前的编译结果变得困难(或不可能?)
原因是,通常,您必须分析整个源代码中的函数调用链。请注意,并非所有表达式都像1 + 1
. Even4.days
已经有些复杂了,因为编译器需要推断days
方法调用的返回类型。
如果您想了解有关设计决策的更多信息,我建议您阅读2015 年的讨论。
你可能会问,为什么它适用于课外的第一个作业?我假设在这种情况下,上下文更加本地化。因此,反对允许它的论点并不完全适用。例如,如果您更改函数内的语句,其效果并不像更改类的布局那样全局。
同样,这是一个权衡。但是在这两种情况下强制类型都会极大地改变体验。虽然在类的上下文中效果相当小,但强制任何赋值的显式类型会将“类 Ruby”Crystal 语言变成传统的类型化语言,其中每个赋值都需要显式类型化。
推荐阅读
- python-3.x - 如何修复 TypeError:G 必须是 'd' 矩阵?
- node.js - 如何选择与 multer-s3 一起使用的 s3 配置文件
- android - 可靠的 BLE 广告
- language-agnostic - 规范模式应该如何处理空候选?
- python - 如何使用脚本停止 python 文件
- java - 如何在春季从控制器中的表单中获取输入日期?
- java - 如何在切换相应选项卡时从 JTabbedPane 从 JPanel 调用函数?
- python - TensorFlow 准确度未更新
- python - pip 和 setuptools 的条件依赖
- jquery - jquery:如何使用正则表达式用 html 一些标记和插入变量包装子字符串?