Il y a quelques jours, j’ai testé Opal.rb. Et pour ça, j’ai écris un jeu du type Space Invaders ;) J’ai une classe Enemy, que je peux résumer ainsi:

class Enemy
  attr_reader :x, :y
  def initialize(x, y)
    @x = x
    @y = y
  end

  def to_s
    "#<Enemy x:#@x y:#@y>"
  end
end

J’ai aussi une classe Enemies, pour gérer ce qui se passe au niveau de tous les ennemies. Inclure le module Enumerable et définir la méthode each me permet d’utiliser toutes les méthodes de ce module.

class Enemies
  include Enumerable

  def initialize
    @enemies = []
  end

  def each(&block)
    @enemies.each(&block)
  end

  def <<(item)
    @enemies << item
  end
end

Créons un groupe de trois ennemies :

enemies = Enemies.new
enemies << Enemy.new(10, 15)
enemies << Enemy.new(20, 15)
enemies << Enemy.new(10, 40)

Voyons si each fonctionne bien :

> enemies.each {|item| puts item }
#<Enemy x:10 y:15>
#<Enemy x:20 y:15>
#<Enemy x:10 y:40>

J’ai donc accès à toutes les autres méthodes de Enumerable, comme par exemple select:

> puts enemies.select {|item| item.x == 10 }
#<Enemy x:10 y:15>
#<Enemy x:10 y:40>

À demain.