2012-08-12 15 views
5

Próbuję uzyskać dobry styl kodowania Ruby. Aby zapobiec przypadkowemu wywołaniu zmiennej lokalnej o tej samej nazwie, zawsze używam w razie potrzeby numeru self.. Ale teraz ja potknąłem się następująco:Wywołanie prywatnej metody xxx za pomocą self.xxx() z innej prywatnej metody powodującej błąd "prywatna metoda" xxx "o nazwie"

class MyClass < ActiveRecord::Base 
    before_validation :sanitize_user_data 

    private 

    def sanitize_user_data 
    self.sanitize_name # with ".self" it's a problem, without it's not! 
    end 

    def sanitize_name 
    unless self.name.nil? 
     self.name.gsub!(/\s+/, ' ') 
     self.name.strip! 
    end 
    end 
end 

powyższych wyników w kodzie błędu

Metoda prywatna sanitize_name nazywa

ale przy usuwaniu self. i tylko przy użyciu sanitize_name, to działa. Dlaczego tak jest?

Odpowiedz

8

Dzieje się tak, ponieważ metody prywatne nie mogą być wywoływane z wyraźną odbiornika, a mówiąc self.sanitize_name wyraźnie określając przedmiot (self), które powinny otrzymać sanitize_name, zamiast opierania się na niejawny odbiornikiem (który jest również self).

Nie możesz tego uniknąć, musisz zadzwonić na zwykłego starego sanitize_name bez wyraźnego odbiornika lub wykonać self.send(:sanitize_name). Nie jestem pewien, czy zawsze jednoznacznie określając self jest naprawdę "dobry styl", ale to subiektywne. Jeśli chcesz zapewnić sobie wywołanie metody zamiast zmienną, dodać nawias:

def a; "method"; end 
a = "variable" 
a() #=> "method" 
a #=> "variable" 
+0

Dziękuję za wyjaśnienia. Będę o tym pamiętać, ale myślę, że naprawdę to rozumiem, musiałbym głęboko zagłębić się w elementy wewnętrzne Ruby, prawda? –

+3

@JoshuaMuheim Niekoniecznie, to tak, jak działają metody prywatne, przez zabronienie jawnego odbiornika nie można wywołać z dowolnego miejsca, w którym niejawny odbiornik nie jest tym samym "ja", ma tylko nieco niefortunny efekt uboczny, uniemożliwiający użytkownikowi wywołanie metody prywatnej z tym samym jawnym odbiornikiem, co niejawny odbiornik. –

+0

Dobra, to interesujące. Wielkie dzięki za wyjaśnienie. :) –

2

Dlaczego?

Z definicji. Prywatne metody mogą być wywoływane tylko przez wysyłanie wiadomości bez odbiornika, co oznacza definicji tego, co znaczy .

+0

+1 Krótki i słodki. –