/ / Racjonalne uzasadnienie pozwalające na ponowne zdefiniowanie stałych Ruby i pozwalające na dostęp do metod prywatnych za pośrednictwem metody send ()? [zamknięte] - rubin, stałe, metody prywatne

Powody, dla których możliwe jest ponowne zdefiniowanie stałych Ruby i umożliwienie dostępu do prywatnych metod za pomocą metody send ()? [zamknięty] - rubin, stałe, prywatne metody

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 № 1

Co 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.