Czy istnieje sposób sprawdzenia, czy obiekt ma klasę singleton bez tworzenia?Jak sprawdzić, czy obiekt ma klasę singleton (eigenclass) bez tworzenia?
Inne niż wymienione w Check if an object has a singleton class, nie jest prawdą, że każdy obiekt ma klasę singleton (patrz dowód pod https://repl.it/DuVJ/2).
następujących podejść przyszło mi do głowy, ale nie działa:
obj.singleton_class
To automatycznie tworzy nową klasę singleton, jeżeli żaden istnieje (patrz https://ruby-doc.org/core-1.9.2/Object.html#method-i-singleton_class).
Korzystanie
ObjectSpace
:has_singleton_class = ObjectSpace.each_object(Class).any? do |klass| klass < self.class && klass.singleton_class? && self.is_a?(klass) end
ten jest bardzo powolny i nie może pracować pod JRuby jak
ObjectSpace
może nie być dostępne.obj.singleton_methods
działa tylko wtedy, gdy klasa singleton ma co najmniej jedną metodę.
Jaki problem starasz się rozwiązać? Jak napisał Jörg w połączonej odpowiedzi: "Ilekroć szukasz klasy singleton, będzie tam". Jaki jest twój przypadek użycia? –
Pracujemy nad https: // github.com/rail/rails/pull/26771. Problem polega na tym, że dodajemy niezamierzone klasy za pomocą 'singleton_class', które przerywa niektóre testy Railsowe, które sprawdzają liczbę klas. Chcielibyśmy przejrzeć 'self.singleton_class' jeśli istnieje, i inaczej wywołać metodę na' self.class'. – Remo
Moja ocena: "ObjectSpace" pozwala spojrzeć za kurtynę. Ale jeśli to zrobisz, możesz zobaczyć rzeczy, których nie powinieneś widzieć. Popieram moje stwierdzenie dotyczące połączonego pytania: klasy singleton zawsze istnieją. Tłumacz może ewentualnie * fizycznie * tworzyć je, gdy są potrzebne, ale za każdym razem, gdy patrzysz na * sprawdzić * czy istnieje, tam * będzie * być jednym. YARV, na przykład, zawsze tworzy klasy singleton dla modułów i klas, bez względu na to, czy są one potrzebne czy nie, i nigdy nie tworzy ich dla innych obiektów, chyba że faktycznie otworzysz je lub dodasz metodę singleton. –