Classes e métodos em Ruby
Vamos criar uma classe para usar seus métodos:
class Greeting
def hi(name)
puts "Hi #{name.capitalize}"
end
end
greeting = Greeting.new
greeting.hi("John")
E sua saída:
$ ruby MyDef.rb
Hi John
Note que estou instanciando um objeto da classe Greeting para só então usá-la.
initialize
Quando for instanciar um objeto também é possível passa para ele atributos, neste próximo exemplo vamos passar o nome para o initialize e usá-lo em outros métodos:
class Greeting
def initialize name
@name = name
end
def hi
puts "Hi #{@name.capitalize}"
end
def bye
puts "Bye #{@name.capitalize}"
end
end
greeting = Greeting.new "John"
greeting.hi
greeting.bye
Métodos com ? e !
Não é obrigatório, mas em Ruby costumamos a usar o ? no final do método para métodos que retornam true ou false.
Exemplo, vamos deixar o name como parâmetro opcional:
class Greeting
def initialize name = ''
@name = name
end
def hi
puts "Hi #{@name.capitalize}"
end
def bye
puts "Bye #{@name.capitalize}"
end
def name
@name
end
def name?
@name != ''
end
end
greeting = Greeting.new "John"
puts greeting.name
puts greeting.name?
greeting = Greeting.new
puts greeting.name
puts greeting.name?
Vamos testar:
$ ruby my.rb
John
true
false
Quanto ao ! é comum que ele modifique o próprio objeto, vamos a um exemplo prático:
class Greeting
def initialize name = ''
@name = name
end
def hi
puts "Hi #{@name.capitalize}"
end
def bye
puts "Bye #{@name.capitalize}"
end
def name
@name
end
def name?
@name != ''
end
def upcase
@name.upcase
end
def upcase!
@name = upcase
end
end
greeting = Greeting.new "John"
puts greeting.upcase
puts greeting.name
puts greeting.upcase!
puts greeting.name
E na saída:
$ ruby my.rb
JOHN
John
JOHN
JOHN
Primeiro o name foi apenas exibido com upcase, mas na chamada de upcase! ele foi modificado e passou a ser assim dentro do objeto.
O que é uma boa prática também é ter o mesmo método sem o !, ou como eu prefiro fazer: primeiro o método que apenas retorna o comportamento que quero e depois um método com ! que modifica o objeto.