Se ho una classe con un attr_accessor
, per impostazione predefinita crea una variabile di istanza insieme ai getter e setter corrispondenti. Ma invece di creare una variabile di istanza, esiste un modo per farlo invece creare una variabile di classe o una variabile di istanza di classe?Come può attr_accessor di Ruby produrre variabili di classe o istanze di classe invece di variabili di istanza?
risposta
Ti piace questa:
class TYourClass
class << self
attr_accessor :class_instance_variable
end
end
Si può guardare a questo come l'apertura del metaclasse della classe (di cui la classe stessa è un esempio) e l'aggiunta di un attributo ad esso.
attr_accessor
è un metodo della classe Class
, aggiunge due metodi alla classe, uno che legge la variabile di istanza e altro che lo imposta. Ecco una possibile implementazione:
class Class
def my_attr_accessor(name)
define_method name do
instance_variable_get "@#{name}"
end
define_method "#{name}=" do |new_val|
instance_variable_set "@#{name}", new_val
end
end
end
Completamente testato attributo di classe di accesso:
class Class
def class_attr_accessor(name)
define_method name do
class_variable_get "@@#{name}"
end
define_method "#{name}=" do |new_val|
class_variable_set "@@#{name}", new_val
end
end
end
Grazie. Mi piace il tuo modo di dire che apre il metaclass della classe e aggiunge un addendum. Ma perché produce una variabile di istanza di classe invece di una variabile di classe? E sarebbe possibile ottenere che produca anche una variabile di classe o questa sintassi funzionerebbe solo per le variabili di istanza di classe? –
I'ts different, see answer again –
Questo funzionerà solo per le variabili di istanza di classe, b/c attr_ * definisce i metodi per le variabili di istanza (di qualche oggetto). – rampion
In Rails, (o dovunque si fa require 'active_support'
) è possibile utilizzare cattr_accessor :name
per ottenere le funzioni di accesso variabili vera classe.
Le variabili di istanza di classe che altri hanno evidenziato sono in genere più utili. Lo APIdock cattr_accessor
page ha alcune discussioni utili che chiariscono quando si desidera uno non l'altro, oltre alla fonte delle funzioni cattr_accessor
, cattr_reader
e cattr_writer
.
molto più facile - non sapeva che le rotaie lo offrivano. Grazie! –
- 1. Ottieni attr_accessor/variabili di istanza in ruby
- 2. variabili di istanza della classe python e variabili di classe
- 3. Garbage Collection di variabili di istanza di classe in Ruby
- 4. Variabili di istanza rispetto a variabili di classe in Python
- 5. Variabili di istanza della classe Ruby ed ereditarietà
- 6. Inizializzazione delle variabili di istanza della classe in Ruby
- 7. Ridefinizione delle variabili di istanza di una classe Smalltalk
- 8. Variabili di istanza e classe Singleton
- 9. Variabili di istanze costanti?
- 10. Ottieni tutte le variabili di istanza dichiarate nella classe
- 11. Variabili di istanza Java vs variabili locali
- 12. Creare dinamicamente attributi di classe con attr_accessor
- 13. Does attr_accessor di Ruby crea automaticamente variabili di istanza per gli attributi?
- 14. variabili di classe imperative di pitone
- 15. Variabile di istanza della classe di Ruby rispetto alla variabile di classe
- 16. Assegnazione composta alla classe Python e variabili di istanza
- 17. Valori predefiniti di variabili di istanza e variabili locali
- 18. Le variabili di istanza della classe in Rails devono essere impostate all'interno di un mutex?
- 19. Python: comprensione delle variabili di classe e istanza
- 20. Rails e variabili di classe
- 21. (U) Ruby Extensions: rb_gc_mark() e variabili di istanza
- 22. Esistono variabili di classe finale statiche pubbliche
- 23. Perché si consiglia di dichiarare variabili di istanza come private?
- 24. variabili di istanza python come argomenti opzionali
- 25. Rails - Variabili locali contro variabili di istanza
- 26. Ruby: Minitest, unità di test e variabili di istanza
- 27. Metodi di istanza e sicurezza thread delle variabili di istanza
- 28. Ordinamento di inizializzatori variabili di istanza
- 29. variabili locali nelle definizioni di classe/ambito
- 30. Collegamento per assegnare variabili di istanza
Fatevi strada attraverso "[Vedi chiaramente Metaclasses] (http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)"; è molto utile quando si cerca di capire come funzionano le classi e gli oggetti di Ruby. –