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