users = ["Zamba","Bicudo", "Igonium","Zamba"]
users.empty?
Uso de bang:
No primeiro exemplo se trata de um método destrutivo, no caso ele remove as duplicidades na array,
ele não apenas retornou uma cópia da array sem duplicidades, mas a alterou
users.empty?
# false
users.uniq!
Já aqui, re retornada uma cópia da array sem duplicidades, porem o objeto original, continua inalterado
#["Zamba","Bicudo", "Igonium"]
users
#["Zamba","Bicudo", "Igonium"]
new_users = users.uniq
users
Bom,só de você, caro desenvolvedor não ter que catar no documentação para saber se a função é destrutiva ou não, ou então ter as 2 opções a disposição, o que em certas linguagens não se tem, obrigando a fazer como no exemplo 3 já é uma grande mão na roda. Além de tudo os métodos destrutivos são mais rápidos e consomem menos recursos, então é legal ter esta opção.
Os métodos de checagem por outro lado deixam o código mais humano, legível até para quem não entende:
Exemplo básico, chegando se uma array está vazia
o que é mais legível?
#["Zamba","Bicudo", "Igonium"]
users
["Zamba","Bicudo", "Igonium", "Zamba"]
users.length == 0
ou
# false
users.empty?
Me parece claro que a segunda opção é mais clara.
Agora imagine que existe um método na array chamado "empty!" (ATENÇÃO: este método não existe na array do ruby ! É só um exemplo)
Por dedução , o que imagina que ele faz ?
Se você disse que ele esvaziou a array, você está certo !
# false
users.empty!
Esse tipo de convenção é muito legal, uma idéia muito simples mas que facilita bastante as coisas. Uma pena que a classe array não tenha este método não acham ?
Mas será que dá para alterar isso ? Sim você pode, e sem ter que criar uma outra class de array estendinda:
em php teria que ser assim:
# []
class SuperArray extends ArrayObject {
public function is_empty(){
}
no Ruby basta redeclarar a classe apenas adicionando o
public function is_empty(){
//código aqui
}}
class Array{
def empty!
}
Note que no exemplo em Php, alterei o nome do método desejado para expressar um questionamento "é vazia ?", enquanto que no Ruby foi criada mais um membro de uma famínia de métodos semelhantes, cujo escopo é o mesmo, temos empty? e empty! agora, e poderíamos ter empty também
Chamamos isso de classes abertas, uma maneira de estender as funcionalidades sem o uso de heranças.
Deixando claro aqui que isso é uma possibilidade, não uma regra. Neste caso específico eu acho que usar herança é como usar um canhão para matar um mosquito, alguns pensam se outra forma, mais rígida ao meu ver e acham que a extensão da classe deixa claro que aquela não é mais uma array "nativa".
Ao meu ver o uso de Herança se é mais interessante quando múltiplas classes irão herdar, não apenas uma.
E vocês o que acham sobre isso ?
def empty!
//código aqui
end}