howto lasciare che i dati rubino share tra una classe e le sue sottoclassi in congiunzione con estendere

StackOverflow https://stackoverflow.com/questions/1451143

  •  12-09-2019
  •  | 
  •  

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?

È stato utile?

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
scroll top