howto lasciare che i dati rubino share tra una classe e le sue sottoclassi in congiunzione con estendere
Domanda
module M
def f=(x)
@f= x
end
def f
@f
end
end
class A
extend M
end
class B < A
end
A.f= 42
puts A.f
puts B.f
questo produce
42
nil
È @f una variabile di classe A e B? Come posso condividere una variabile tra A e B da solo scrivendo questo in M?
Soluzione
Non utilizzando @@ f direttamente, ma piuttosto class_variable_set () e class_variable_get (), variabili di classe di A, B e C possono essere utilizzate all'interno di M.
module M
def f=(x)
class_variable_set("@@f", x)
end
def f
class_variable_get("@@f")
end
end
class A
extend M
end
class B < A
end
class C
extend M
end
A.f= 42
C.f= 23
puts A.f
puts B.f
puts C.f
questo produce
42
42
23
Come si può vedere, le variabili sono condivise da A e B, ma non C.
Altri suggerimenti
B :: A.F produrrà il risultato corretto
variabili di classe possono fare ciò che è necessario qui:
module M
def f=(x)
@@f= x
end
def f
@@f
end
end
class A
extend M
end
class B < A
end
A.f= 42
puts A.f
puts B.f
Questo produce:
42
42
Questo sembra essere più vicino al comportamento desiderato:
def M()
m = Module.new
m.module_eval <<-HERE
def f=(x)
@@f= x
end
def f
@@f
end
HERE
m
end
class A
extend M()
end
class B < A
end
class C
extend M()
end
A.f= 42
puts A.f
puts B.f
C.f = 23
puts C.f
puts A.f
puts B.f
produce:
42
42
23
42
42
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow