Dynamisk instansiering av objekter i Ruby
I Ruby, som i mange andre språk er det mulig å instansiere et objekt uten å vite på forhånd hvilken klasse det skal instansieres fra. Faktisk er det lekende lett å gjøre det.
Alle klasser som er definert er tilgjengelig som konstanter i
Object-klassen. Alle klasser i Ruby har metoden
const_get(sym) som tar et symbol eller en streng og returnerer verdien av konstanten ved det gitte navnet.
Dermed kan man dynamisk instansiere en klasse så lett som:
dyn_obj = Object.const_get('KlasseNavn').new
Dette er eksempelvis nyttig i tilfeller der du skal instansiere et objekt av en subklasse av en kjent klasse, men hvor den gitte subklassen er ukjent. Subklassens navn kan finnes som en streng eller et symbol, og dermed har du alt du trenger.
Kommentarer
Marius Mathiesen
(http://shortcut.no/)
15. februar, 13:02
Om man bruker Rails har man en praktisk metode på String-objekter som heter constantize:
eller om man har noe som burde kunne gjøres til en klasse i Rails-speak:
Ganske fett for eksempel når man skal gjøre polymorfe assosiasjoner i en controller (user has_many :images, :as => :pictureable) og poster et bilde til /user/1/images (som er en controller som håndterer bilder fra mange slags pictureables (som altså er objekter som har bilder) - for eksempel.
Christian
15. februar, 22:37