Ludu kun class.new kaj Rubeno

Se vi programas per Ruby dum iom da tempo, vi eble jam scias ke klasoj in Ruby estas mem objektoj, specife, plenumo de Class. Antaŭ la amuzaĵo, mi resumas kion tio signifas.

Ĉi tie estas kutima metodo por difini klasoj

class Punkto
  def initialize(x,y)
    @x, @y = x,y
  end

    attr_reader :x, :y

    def distanco(punkto)
      Math.hypet(punkto.x - x, punkto.y-y)
    end
end

Amuze, la antaŭa defino esence estas la sama kiel la sekva

Punkto = Class.new do
  def initialize(x,y)
    @x, @y = x,y
  end

    attr_reader :x, :y

    def distanco(punkto)
      Math.hypet(punkto.x - x, punkto.y-y)
    end
end

Mi ĉiam pensis ĉi tion kiel bela decido en Rubeno, ĉar ĝi montras la simplecon de la objekta modelo kaj ĝiajn bazajn hokojn. Plikonstruktante la koncepton, mi montros utilajn konceptojn de senpersonecaj difinitaj klasoj kiujn mi uzas en realaj projektoj.

Do, anstantaŭ verki:

module Programo
  module Eraroj
    class FuŝKonverto < StandardError; end
    class NekonataTiparo < StandardError; end
  end
end

Ekzistas kialojn por subklasi StandardError kaj plenumi ĝin, en ĉi okazo mi nur volas havi nomitan escepton por kapti, do mi ne bezonas havi ion alian ol nomita konstanto. Class.new uzeblas por krei subklasojn, kiu pli klare montras la volon:

module Programo
  module Eraroj
    FuŝKonverto = Class.new(StandardError)
    NekonataTiparo = Class.new(StandardError)
  end
end