2011-10-04 10 views
11

Po wywołaniu metody, która nie istnieje, method_missing wyświetli mi nazwę tej metody. Kiedy próbuję uzyskać dostęp do zmiennej, która nie została ustawiona, wartość jest po prostu nil.Czy Ruby ma odpowiednik method_missing dla niezdefiniowanych zmiennych instancji?

Próbuję dynamicznie przechwytywać dostęp do zer zmiennych instancji i zwracać wartość w oparciu o nazwę zmiennej, do której uzyskiwany jest dostęp. Najbliższym odpowiednikiem będzie PHP __get. Czy istnieje odpowiednik funkcji w Ruby?

+0

Czy wiesz o ostrzeżeniach i sposobach ich włączania? –

Odpowiedz

0

Nie ma wystąpienia instance_variable_missing (przynajmniej o tym wiem) Ale dlaczego uzyskujesz dostęp do losowo nazwanych zmiennych instancji?

Jeśli twój wątek będzie miał dostęp do stanu obiektu poprzez wywołania metod (tak jak powinno), to nie potrzebujesz tego.

Jeśli szukasz sposobu na zdefiniowanie magicznych rzeczy bez komplikacji przy wyszukiwaniu metod, możesz użyć const_missing.

+0

Zmienne nie są losowo nazwane. Używam renderowania wiadomości e-mail bez przechodzenia przez program pocztowy odpowiedzialny za konfigurowanie zmiennych instancji w celach testowych. Widok będzie próbował uzyskać dostęp do rzeczy takich jak '@ user.name' bez ustawiania' @ user'. Pomyślałem, że będę w stanie dynamicznie generować obiekty FactoryGirl dla rzeczy takich jak '@ user' przy pierwszym czytaniu. – meagar

+0

Widzę dzięki. AFAICT Obawiam się, że jedyną opcją jest odczytanie pliku szablonu i odpowiednie ustawienie vars (lub ewentualnie obrócenie problemu i użycie 'method_missing' w szablonie wiadomości e-mail). To wstyd, ponieważ ruby ​​nawet _knows_, gdy uzyskujesz dostęp do niezdefiniowanej zmiennej i da ci ostrzeżenie. – riffraff

2

Nie wierzę, że jest to możliwe w Ruby. Zalecanym sposobem byłoby użycie w swoich szablonach instancji "użytkownika", a nie "@użytkownika".

Jest to zgodne ze sposobem, w jaki radzisz sobie z obiektami Ruby na zewnątrz ('' obj.user '' jest metodą, która odnosi się do "@user", ale w rzeczywistości nie jest "@user"). Jeśli potrzebujesz jakiejś specjalnej logiki z atrybutem, najlepiej jest użyć metody (lub method_missing), niezależnie od tego, czy uzyskujesz dostęp do niej z wnętrza czy z zewnątrz obiektu.

1

Zobacz mój answer to another similar question. Ale tylko dlatego, że możesz może zrobić to nie znaczy, że to dobry pomysł. Rozsądny projekt może na ogół przezwyciężyć potrzebę tego rodzaju rzeczy i pozwolić na stworzenie bardziej czytelnego, a tym samym możliwego do utrzymania kodu.

instance_variable_get wydaje się być najbliższym odpowiednikiem PHP __get z tego, co widzę (chociaż nie jestem użytkownikiem PHP).

Patrząc na relevant Ruby source code, jedyną "brakującą" metodą zmiennych jest const_missing dla stałych, nic dla zmiennych instancji.

+1

Nie pomaga. Będę musiał włączyć wszystkie moje zmienne wystąpienia instancji w wywołaniach metod, co jest całkowicie niepraktyczne. – meagar

+0

Cóż, nie ma takiego obiektu w Ruby, aby dynamicznie uzyskiwać dostęp do zmiennych instancji innych niż to, które opisałem w tej innej odpowiedzi. Zobacz zaktualizowaną odpowiedź powyżej. – arcresu

Powiązane problemy