没有重载匹配 'Array(Person)#+' 类型为 Person

no overload matches 'Array(Person)#+' with type Person

所以我刚开始学习 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)

我做错了什么? 提前致谢!

您正在尝试将数组和人物放在一起。但是你可以添加 Array to Array only.

要解决它,你应该使用 Array#<<,像这样: people << Person.new("Person#{id}")

注意: 检查你的第 25 行,它应该是 break if counter == 5

我看到你的回答已经回答了, 但由于水晶的威力,我认为值得一提的是,您提供的所有代码也可以写成:

class Person
  getter name, age = 0
  def initialize(@name : String); end
end

puts Array.new(5) { |i| Person.new("Person#{i + 1}") }

很棒吧? :D

getter是在Objectclass中定义的宏,它是每个class.

的超class

 def initialize(@name)
 end

和写作一样

 def initialize(name)
   @name = name
 end

还有这条简洁的小线:

Array.new(5) { |i| Person.new("Person#{i + 1}") }

Array.new(5) 创建一个空数组,并生成从 0 开始(包括 0)到 5(不包括 5)的每个整数。因此,先前传递的数字的空数组索引被分配给值 return 被阻止。 所以我们在块中创建一个索引加1的人,由于块中的最后一个值变成return值,除非使用returni的数组索引' s值变成新人


是否写

def initialize(@name); end

def initialize(@name)
end

只是您的个人喜好