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