Eu tenho uma pergunta de duas partes
Melhor prática
- Eu tenho um algoritmo que executa algumas operações em uma estrutura de dados usando a interface pública
- Atualmente, é um módulo com vários métodos estáticos, todos privados, exceto o método de interface pública.
- Existe uma variável de instância que precisa ser compartilhada entre todos os métodos.
Estas são as opções que consigo ver, qual é a melhor ?:
- Módulo com métodos estáticos ('módulo' em ruby)
- Classe com métodos estáticos
- Módulo Mixin para inclusão na estrutura de dados
- Refatore a parte do algoritmo que modifica essa estrutura de dados (muito pequena) e faça disso uma combinação que chama os métodos estáticos do módulo do algoritmo
Parte técnica
Existe alguma maneira de fazer um método de módulo privado ?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
O private
in lá parece não ter nenhum efeito , ainda posso ligar Thing.priv
sem problemas.
ruby
private-methods
access-specifier
Daniel Beardsley
fonte
fonte
private
afeta apenas métodos de instância, não métodos de classe. use noprivate_class_method
lugar:module Thing; def self.pub; end; private_class_method :pub; end
Respostas:
Acho que a melhor maneira (e principalmente como as bibliotecas existentes são escritas) de fazer isso é criando uma classe dentro do módulo que lida com toda a lógica e o módulo fornece apenas um método conveniente, por exemplo
fonte
perform
não é o método que supostamente é privado aqui, o método privado é o método privado daTranslator
classe (o exemplo de @ ucron não tem nenhum, o que é muito lamentável).GTranslate.translate
é apenas um método conveniente, poisGTranslate::Translator#perform
não há ganho real em ocultá-lo, se é que era possível.self.translate
declara um método de classe / módulo.GTranslate::Translator.new.perform(text)
- complicado, mas não privado!Há também
Module.private_class_method
, o que provavelmente expressa mais intenção.Para o código em questão:
Ruby 2.1 ou mais recente:
fonte
private
?fonte
include Writer
opção!Você pode usar o método "incluído" para fazer coisas fantasiosas quando um módulo é misturado. Isso faz o que você quiser, eu acho:
fonte
included do |base| [...] end
vez de defInfelizmente,
private
só se aplica a métodos de instância. A maneira geral de obter métodos "estáticos" privados em uma classe é fazer algo como:Admito que não brinquei com isso em módulos.
fonte
.foo
um método de classe privado: "private; def self.foo ()"private
eprivate_class_method
são de propriedadeModule
nãoClass
. Este código funciona por sinal e é a alternativa de usoprivate_class_method
.Uma maneira legal é assim
fonte
Que tal armazenar métodos como lambdas em variáveis / constantes de classe?
Para teste:
UPD: grande atualização deste código após 6 anos mostra uma maneira mais limpa de declarar o método privado
d
Aqui vemos que:
1)
@@L
não pode ser acessado de fora, mas é acessível de quase todos os lugares2)
class << self ; private ; def
torna o métodod
inacessível de fora e de dentro com sucesso,self.
mas não sem ele - isso é estranho3)
private ; self.
eprivate ; class << self
não torna os métodos privados - eles são acessíveis ambos com e semself.
fonte
Proc
, enquanto os métodos são do tipoMethod
.Faça um módulo ou classe privada
As constantes nunca são privadas. No entanto, é possível criar um módulo ou classe sem atribuí-lo a uma constante.
Portanto, uma alternativa
:private_class_method
é criar um módulo ou classe privada e definir métodos públicos nele.Uso:
Consulte os documentos de Module.new e Class.new .
fonte
.self
nas definições do método, incluí-lo em outra classe e usá-los como instance_methods da classe de inclusão. Você sabe se há alguma maneira de fazer funcionar?Este método não permitirá o compartilhamento de dados com os métodos privados, a menos que você passe explicitamente os dados por parâmetros de método.
fonte