programacion objetos metodos manejo lista herencia ejemplos ejemplo clases clase ruby static encapsulation

objetos - ¿Clase de Ruby con método estático llamando a un método privado?



manejo de objetos en ruby (3)

Tengo una clase con una serie de métodos estáticos. Cada uno tiene que llamar a un método común, pero estoy tratando de no exponer este último método. ¿Hacerlo privado solo permitiría el acceso desde una instancia propia de la clase? Protegido no parece que solucione el problema aquí tampoco.

¿Cómo oculto que do_calc se llame externamente en un contexto estático? (Dejándolo disponible para ser llamado desde los dos primeros métodos estáticos).

class Foo def self.bar do_calc() end def self.baz do_calc() end def self.do_calc end end


En primer lugar, la static no es realmente parte de la jerga de Ruby .

Tomemos un ejemplo simple:

class Bar def self.foo end end

Define el método foo en un objeto explícito, self , que en ese ámbito devuelve la clase que contiene la Bar . Sí, se puede definir un método de clase , pero la estática no tiene sentido en Ruby.

Entonces private no funcionaría, porque la definición de un método en un objeto explícito (por ejemplo, def self.foo ) omite los calificadores de acceso y hace público el método.

Lo que puede hacer es usar la sintaxis de la class << self para abrir la metaclase de la clase contenedora y definir los métodos allí como métodos de instancia:

class Foo class << self def bar do_calc end def baz do_calc end private def do_calc puts "calculating..." end end end

Esto te dará lo que necesitas:

Foo.bar calculating... Foo.baz calculating... Foo.do_calc NoMethodError: private method `do_calc'' called for Foo:Class


O a partir de Ruby 2.1:

class Foo def self.bar do_calc end private_class_method def self.do_calc #... end end


Puedes definir un método de clase privado con private_class_method como este:

class Foo def self.bar do_calc end def self.baz do_calc end def self.do_calc #... end private_class_method :do_calc end