crystal-lang

Array of objects in Crystal


Beginner question:

How to make an Array of objects from a Struct in Crystal? Or how to make an array of objects in Crystal? I am trying to emulate the go code.

struct Book 
   def initialize(
     @Id : Int32,
     @Title : String,
     @Author : String, 
     @Desc : String
   )
   end
 end

 books = [] of Int32 | String <--- This is wrong
 book1 = Book.new(1, "Hello", "Me", "This is a test.")


GO CODE: 

type Book struct {
   Id     int    `json:"id"`
   Title  string `json:"title"`
   Author string `json:"author"`
   Desc   string `json:"desc"`
}

var Books = []models.Book{
   {
       Id:     1,
       Title:  "Golang",
       Author: "Gopher",
       Desc:   "A book for Go",
   },
}

Changing to a class allows me to return a new object. Which I am sure is the wrong way to make a new object in Crystal? I can then add objects to the array.

  class Book 
    def initialize(id : Int32, title : String, author : String, desc : String)
      @id = id
      @title = title
      @author = author
      @desc = desc
    end

    def object 
      {
        @id,
        @title,
        @author,
        @desc
    }
    end 

  end


  books = [] of Book <--- HOW TO SET ARRAY OF OBJECTS ON THE TYPE?
  book1 = Book.new(1, "Hello", "Me", "This is a test.")
  puts book1.object
  books << book1.object
  puts books

Solution

  • It seems really what I wanted, and what was not the same as the struct version in go was an Array of Hashes, which in turn is an Array of Objects, as everything is an Object in Crystal?*.

      hash = [] of Hash(Int32, String) # Array of Hashes
      hash0 = {0 => "Jackson0"}
      hash1 = {1 => "Jackson1"}
      hash2 = {2 => "Jackson2"}
      hash3 = {3 => "Jackson3"}
    
      #Append the hashes to the array
    
      hash << hash0
      hash << hash1
      hash << hash2
      hash << hash3
    
    OR
    
      (0..3).each do |i| 
        hash << {i => "Jackson#{i}"}
      end
      RESULT : [{0 => "Jackson0"}, {1 => "Jackson1"}, {2 => "Jackson2"}, {3 => "Jackson3"}]
    
      # Display them as JSON
    
      get "/" do
        hash.to_json
      end
    
    RESULT : [{"0":"Jackson0"},{"1":"Jackson1"},{"2":"Jackson2"},{"3":"Jackson3"}]
    
    Which in turn can be queried using hash[0][1] 
    
    RESULT : {"1": "Jackson1"}