Crystal语法求助:Array(Person)#+匹配Person类型出现重载错误
解决Crystal中Array#+=的重载匹配错误
嘿,这问题我刚学Crystal的时候也踩过一模一样的坑!让我给你掰扯清楚:
你遇到的错误no overload matches 'Array(Person)#'+' with type Person,核心原因是Crystal的Array#+=方法要求右边必须是一个数组,而你传了单个Person对象。
看报错里的重载定义就能明白:Array(T)#+(other : Array(U)),这个+方法只接受数组类型的参数,会返回两个数组合并后的新数组,+=就是把这个结果赋值回原变量。而你直接传单个Person,类型完全不匹配,所以找不到合适的重载。
两种靠谱的解决办法:
- 把单个元素包装成数组传给
+=,让类型匹配:people += [Person.new("Person#{id}")] - 更推荐的方式:用Crystal专门设计的单个元素添加方法
<<(推操作符)或者push,代码更直观,也符合数组操作的最佳实践:people << Person.new("Person#{id}") # 或者等价的写法 people.push(Person.new("Person#{id}"))
顺带提一句,Crystal虽然语法风格像Ruby,但类型系统更接近C的强类型规则,所以不像Ruby那样能自动把单个元素转成数组适配+=,得严格按照方法的参数要求来写~
内容的提问来源于stack exchange,提问作者Alexis Knox
相关产品推荐
相关产品推荐

