Zamiana string na obiekt

chciałem sie podzielić ciekawym kawałkiem kodu :wink:

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

Stare ale jare :).

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ć :wink:

class String
def to_object
Object.module_eval("::#{self}", FILE, LINE)
end
end

Jest pewnie szybsze :slight_smile: 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?

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 :slight_smile:

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? :slight_smile:

eval jest ogólnie brzydki :slight_smile:

Tomash mamy dwa przypadki

  1. safe_level
  • moja metoda działa i jest bezpieczna
  • metoda PaKa też jest bezpieczna - bo nie działa
  1. nie ma safe_level
  • moja metoda jest bezpieczna
  • metoda PaKa nie

sarkazm jak najbardziej usprawiedliwiony

Podstawą DSLi moim zdaniem jest method_missing :wink: ale instance_eval w wątku z safe_level podniesionym też sie przydaje