chciałem sie podzielić ciekawym kawałkiem kodu
class String
def to_object
self.split("::").inject(Object){|result, constant| result.const_get(constant)}
end
end
przykład:
module Foo
module Bar
class Keke
end
end
end
foo = “Foo::Bar::Keke”
foo.to_object
nom, sam kod dosyć stary, znajduje sie w zdaje sie w facets, ale tak czy tak jest piękny i uznałem że każdy powinien go znać
class String
def to_object
Object.module_eval("::#{self}", FILE , LINE )
end
end
Jest pewnie szybsze i ogolnie ja jakos nie przepadam za metoda inject. O ile jeszcze map jest znosne, to inject potrafi dac naprawde uperdliwy kod dla oczu.
za to twój jest niezwykle bezpieczny wystarczy “Kernel.system('rm -rf ~/ ')”.to_object
jak w ten sposób chcesz pobierać moduł o nazwie pobranej np. z sieci?
Tomash
April 29, 2008, 6:36pm
6
Właśnie miałem napisać, że wszelkie (nad)używanie eval i jego mutacji to proszenie się o masakrę.
Ale też Świstak nie przesadzaj - podany przez Ciebie string nie przejdzie jeśli jest z sieci, bo ma tainta. Także sarkazm niepotrzebny
eval/instance_eval to podstawa DSL? Idac ta droga nalezalo by sie zastanowic po co wogole String.to_object ? To tylko jeden z srodkow do celu prawda?
eval jest ogólnie brzydki
Tomash mamy dwa przypadki
safe_level
moja metoda działa i jest bezpieczna
metoda PaKa też jest bezpieczna - bo nie działa
nie ma safe_level
moja metoda jest bezpieczna
metoda PaKa nie
sarkazm jak najbardziej usprawiedliwiony
Podstawą DSLi moim zdaniem jest method_missing ale instance_eval w wątku z safe_level podniesionym też sie przydaje