为什么此代码对实例变量失败?
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/