Istnieje kilka klas Ruby, które nie zezwalają na definiowanie metod singletowych na swoich instancjach. Na przykład, Symbol
:Dlaczego pojedynczych metod nie można zdefiniować w Symbole lub Fixnums?
var = :asymbol
def var.hello
"hello"
end
# TypeError: can't define singleton method "hello" for Symbol
Pomyślałem, że może to być ograniczenie wszystkich natychmiastowych wartości, ale wydaje się, aby pracować dla nil
, true
i false
(ale nie przypadki Fixnum
lub Bignum
):
var = true
def var.hello
"hello"
end
var.hello #=> "hello"
Nie rozumiem, dlaczego Ruby pozwala na definiowanie pojedynczych metod dla określonych klas obiektów, ale nie dla innych.
Wydaje się, że nie jest to po prostu 'Fixnum's, ale dowolny' Numeric'. –
Moją reakcją jest to, że ma coś do zrobienia w/types, które miałyby tę samą wartość niezależnie od kontekstu. Symbol ': fred' będzie zawsze tym samym obiektem symbolu, co" 5 ". Niestety tak samo jest w przypadku "true", więc jest to coś głębszego; Zastanawiam się najpierw, czy jest tak samo w różnych wersjach, a potem zastanawiam się, w jaki sposób wprowadzono stałość każdego typu. –
Dokument dla [Object # singleton_class] (http://ruby-doc.org/core-2.3.0/Object.html#method-i-singleton_class) stwierdza: "Jeśli [odbiorca]" obj "ma wartość" nil " , 'true' lub' false' zwraca odpowiednio 'NilClass',' TrueClass' lub 'FalseClass' .Jeśli' obj' jest 'Fixnum' lub' Symbol', powoduje to 'TypeError'." Jak zauważa @Andrew, żadna wartość liczbowa nie może mieć klasy singleton. 'nil',' true' i 'false' mają klasy singleton (np.' class << false; put self, end # => FalseClass'), ale ponieważ te klasy mają tylko jedną instancję, nie ma sensu rozróżniać między klasa i klasa singleton. –