Esistono alcune classi Ruby che non consentono di definire i metodi Singleton nelle rispettive istanze. Ad esempio, Symbol
:Perché i metodi Singleton non possono essere definiti su Simboli o Fixnum?
var = :asymbol
def var.hello
"hello"
end
# TypeError: can't define singleton method "hello" for Symbol
ho pensato che questo potrebbe essere una restrizione su tutti i valori immediati, ma sembra di lavorare per nil
, true
, e false
(ma non istanze di Fixnum
o Bignum
):
var = true
def var.hello
"hello"
end
var.hello #=> "hello"
Non capisco perché perché Ruby consente di definire i metodi singleton su determinate classi di oggetti ma non su altri.
Sembra non essere solo 'Fixnum's, ma qualsiasi' Numerico'. –
La mia reazione istintiva è che ha qualcosa da fare con i tipi che sarebbero lo stesso valore indipendentemente dal contesto. Un simbolo ': fred' sarà sempre lo stesso oggetto simbolo, come' 5'. Sfortunatamente, lo stesso è vero per 'true', quindi è qualcosa di più profondo di quello; Mi chiedo per prima cosa se è uguale per tutte le versioni, quindi mi chiedo come sia stata implementata la costanza di ogni tipo. –
Il doc per [Object # singleton_class] (http://ruby-doc.org/core-2.3.0/Object.html#method-i-singleton_class) afferma: "Se [destinatario]' obj' è 'nil' , 'true', o' false' restituisce 'NilClass',' TrueClass' o 'FalseClass', rispettivamente.Se' obj' è un 'Fixnum' o un' Symbol', solleva un 'TypeError'." Come note @Andrew, tuttavia, nessun valore numerico può avere una classe singleton. 'nil',' true' e 'false' hanno classi singleton (es.' class << false; puts self; end # => FalseClass'), ma dato che quelle classi hanno solo una singola istanza, non ha senso distinguere tra la classe e la classe singleton. –