没有重载匹配'类型为Person的数组(Person)#+'

时间:2018-02-12 16:41:34

标签: crystal-lang

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

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

2 个答案:

答案 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

getterObject类中定义的宏,它是每个类的超类。

并且

 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

只是您的个人偏好