所以我刚开始学习Crystal,因为我喜欢Ruby和C,但我还是无法掌握语法。我想我很亲密,但我坚持这个错误
no overload matches 'Array(Person)#+' with type Person
Overloads are:
- Array(T)#+(other : Array(U))
people += Person.new("Person#{id}")
这是代码。
class Person
def initialize(name : String)
@name = name
@age = 0
end
def name
@name
end
def age
@age
end
end
people = [] of Person
counter = 0
id = 0
loop do
id+=1
people += Person.new("Person#{id}")
counter+=1
break if counter = 5
end
puts(people)
我做错了什么? 提前谢谢!
答案 0 :(得分:5)
你正试图把一个数组和一个人放在一起。但您可以添加Array to Array only.
要解决此问题,您应该使用Array#<<
,如下所示:
people << Person.new("Person#{id}")
注意:检查第25行,它应为break if counter == 5
答案 1 :(得分:4)
我看到你的回答得到了解答, 但由于水晶的味道很棒,我认为值得一提的是,您提供的所有代码也可以写成:
class Person
getter name, age = 0
def initialize(@name : String); end
end
puts Array.new(5) { |i| Person.new("Person#{i + 1}") }
真棒吗? :d
getter
是Object
类中定义的宏,它是每个类的超类。
并且
def initialize(@name)
end
与写作
相同 def initialize(name)
@name = name
end
这是一个简洁的小线:
Array.new(5) { |i| Person.new("Person#{i + 1}") }
Array.new(5)
创建一个空数组,并生成每个整数,包括0,最多但不包括5.因此,传递的数字的先前空数组索引被赋值给块返回的值。
因此,我们在块中创建索引加1的人,并且由于块中的最后一个值变为返回值,除非使用return
,否则i
的值的数组索引将变为新人。
是否写
def initialize(@name); end
或
def initialize(@name)
end
只是您的个人偏好