Kiedy próbujemy przedefiniować stałą, Ruby wyświetla tylko ostrzeżenie, ale nie błąd. Więc zawsze można na nowo zdefiniować stałą w Ruby?
Za pomocą metody send można również wywołać prywatną metodę klasy:
Const = 12
puts Const
#only an warning: already initialized constant Const
Const = 14
puts Const #Displays 14
class MyClass
private
def priv
puts "In private method"
end
end
obj = MyClass.new
#Error: private method `priv" called for #<MyClass:0x7f2cfda21738> (NoMethodError)
#obj.priv
#but this is fine!
obj.send(:priv)
Czy są jakieś uzasadnienia dla takich projektów w Ruby? Czy nie naruszają one podstawowej idei stałych i specyfikatorów dostępu?
Czy istnieje rzeczywiste, praktyczne zastosowanie tych wzorów? Niektóre przykłady byłyby świetne, gdyby były!
Uwaga: Widzę tu wiele pytań / dyskusji dotyczących stałych Ruby i metod prywatnych, ale nie znalazłem nic związanego z ich przyczyną.
Odpowiedzi:
3 dla odpowiedzi № 1Co się tyczy send
, odpowiedź jest raczej prosta: po użyciu refleksji wszystkie zakłady są wyłączone. Pamiętaj, że nie różni się to również od większości innych języków, możesz też ominąć ograniczenia dostępu w Javie, używając na przykład odbicia.
A dla stałych, cóż, ty zrobić dostać ostrzeżenie. ty zrobić powiedz, że coś robisznie powinien. Ale Ruby jest językiem, który ufa, że wiesz, co robisz. Nie przeszkodzi ci to. Jeśli chcesz strzelić sobie w stopę, powinieneś mieć taką możliwość. Lub, bardziej cyniczny sposób patrzenia na to: w Ruby jest tyle złych rzeczy, które można zrobić, redefiniowanie stałych naprawdę nie ma aż tak wielkiego znaczenia.