为何Crystal无法在初始化器中推断Set实例变量的类型?
解决Crystal中Set实例变量类型推断的问题
这个问题其实是Crystal类型系统的一个常见细节——虽然你传入的sides是Array(Int32),但编译器没法自动把Set.new(@sides)的返回类型绑定到实例变量@set上,因为实例变量的类型需要在类定义阶段就明确下来,而不是仅靠初始化方法里的赋值推断。
下面给你两种可行的解决办法:
方法一:显式声明实例变量的类型
直接在类里指定@set的类型为Set(Int32),这样编译器就明确知道它的类型了:
class Triangle @set : Set(Int32) # 显式声明类型 def initialize(@sides : Array(Int32)) @set = Set.new(@sides) end end
方法二:初始化Set时显式指定类型
在创建Set实例的时候,明确告诉编译器这个Set的元素类型是Int32,这样返回的Set(Int32)就能被正确推断为@set的类型:
class Triangle def initialize(@sides : Array(Int32)) @set = Set(Int32).new(@sides) # 显式指定Set的元素类型 end end
为什么会出现这个问题?
Crystal的类型推断在局部变量上表现很灵活,但对于实例变量,编译器需要更明确的类型信息——因为实例变量属于整个类,而不是某个方法的局部作用域。虽然Set.new(@sides)确实会返回Set(Int32),但编译器不会自动把这个方法内的类型推断结果提升为实例变量的类型,必须通过显式声明或者显式指定构造类型来明确。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

