Eu encontrei um post no blog alias
vs. alias_method
. Como mostrado no exemplo dado nessa postagem do blog, eu simplesmente quero aliasar um método para outro dentro da mesma classe. Qual devo usar? Eu sempre vejo alias
usado, mas alguém me disse que alias_method
é melhor.
Uso de alias
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
Uso de alias_method
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
alias
"ao alternar métodos no escopo da classe lexical" ealias_method
"ao alternar métodos de módulos, classes ou classes singleton em tempo de execução" github.com/bbatsov/ruby-style-guide#alias-methodividicamenteRespostas:
alias_method
pode ser redefinido, se necessário. (é definido naModule
classe.)alias
O comportamento da empresa muda de acordo com seu escopo e pode ser bastante imprevisível às vezes.Veredicto: Use
alias_method
- oferece muito mais flexibilidade.Uso:
fonte
alias :new_method_name :old_method_name
ORalias_method :new_method_name, :old_method_name
alias_method
é determinado no tempo de execução e não quando o código é lido, comoalias
, por isso, se comporta mais como esperávamos .def
vs.define_method
: "define_method
. Pode ser redefinido em caso de necessidade (é definido noModule
. Classe)def
's comportamento muda dependendo do seu alcance e pode ser bastante imprevisível, às vezes Veredicto: Use.define_method
- dá-lhe uma tonelada mais flexibilidade ".Além da sintaxe, a principal diferença está no escopo :
No caso acima, o método "name" escolhe o método "full_name" definido na classe "Developer". Agora vamos tentar com
alias
.Com o uso do alias, o método "name" não pode escolher o método "full_name" definido no Developer.
Isso ocorre porque
alias
é uma palavra-chave e seu escopo é lexicamente. Isso significa que trataself
o valor de si mesmo no momento em que o código fonte foi lido. Em contraste,alias_method
trataself
como o valor determinado no tempo de execução.Fonte: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
fonte
Um ponto a favor de em
alias
vez dealias_method
é que sua semântica é reconhecida pelo rdoc, levando a referências cruzadas na documentação gerada, enquanto o rdoc ignora completamentealias_method
.fonte
alias_method
? Isso parece realmente improvável e, se alguém fizer isso, deve estar disposto a sofrer as consequências no RDoc. Se o seu argumento é que é impossível, então por que você acha isso e como você acha que o Yardoc faz isso?Eu acho que existe uma regra não escrita (algo como uma convenção) que diz para usar 'alias' apenas para registrar um alias de nome de método, significa que se você deseja atribuir ao usuário do seu código um método com mais de um nome:
Se você precisar estender seu código, use a meta alternativa ruby.
fonte
Um ano depois de fazer a pergunta, chega um novo artigo sobre o assunto:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Parece que "tantos homens, tantas mentes". A partir do artigo anterior, o autor incentiva o uso
alias_method
, enquanto o último sugere o usoalias
.No entanto, há uma visão geral comum desses métodos nos posts do blog e nas respostas acima:
alias
quando você quiser limitar o alias no escopo em que está definidoalias_method
para permitir que classes herdadas acessemfonte
Os colaboradores da gema rubocop propõem em seu Guia de estilo Ruby :
fonte
alias_method new_method , old_method
old_method será declarado em uma classe ou módulo que está sendo herdado agora para a nossa classe onde new_method será usado.
estes podem ser variáveis ou método ambos.
Suponha que Class_1 tenha o método old e Class_2 e Class_3 herdem a Class_1.
Se a inicialização da Classe_2 e da Classe_3 for feita na Classe_1, ambos poderão ter um nome diferente na Classe_2 e na Classe_3 e seu uso.
fonte