2012-12-19 9 views
25

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.

+0

Sembra non essere solo 'Fixnum's, ma qualsiasi' Numerico'. –

+0

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

+0

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

risposta

20

Questo ha a che fare con un concetto chiamato "valori immediati" come descritto in here da Matz.

In verità, nessun valore immediato dovrebbe consentire un metodo Singleton. Tuttavia, nel caso di true, false e nil, esistono in realtà classi Singleton che supportano questi valori (o il valore è in realtà la classe Singleton - Non ne sono sicuro). È quindi possibile aggiungere istanze Singleton alla classe di supporto che si manifesta come se fosse il valore stesso. Le istanze numeriche e simboliche non sono singleton (ovviamente) e non hanno nessun posto dove tenere i metodi singleton.

+0

Hmm, sono 'true',' false' e ​​'nil' non sono più valori immediati? Hai un riferimento per questo? –

+1

Sembra che [siano effettivamente ancora valori immediati] (http://www.ruby-doc.org/core-1.9.3/ObjectSpace.html#each_object-method). La differenza effettiva è descritta sopra, vedere aggiornato. – PinnyM

Problemi correlati