Created
June 4, 2022 20:49
-
-
Save leandronsp/6cb73bf805ab66f31953a51c8657ae56 to your computer and use it in GitHub Desktop.
Entendendo attr_accessor, writer e reader no Ruby
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Dog | |
def name | |
# retorna variável de instância | |
@name | |
end | |
end | |
doguinho = Dog.new | |
# Chamando método de instância | |
# Mas como a variável de instância não está definida, retorna nil | |
doguinho.name # nil | |
# Precisamos então definir a variável de instância através de outro método | |
# (lembrando que em Ruby tudo é objeto, portanto toda interação com objetos é feita com métodos) | |
class Dog | |
def name | |
@name | |
end | |
def set_name(name) | |
# define a variável de instância utilizando o argumento passado para o método | |
@name = name | |
end | |
end | |
doguinho = Dog.new | |
doguinho.set_name('Spike') | |
# Chamando método de instância | |
# E como a variável de instância foi definida com a chamada do método "set_name", o valor retornado é Spike | |
doguinho.name # Spike | |
# Mas o Ruby fornece um açúcar sintático para metodos "setters" de variáveis de instância | |
class Dog | |
def name | |
@name | |
end | |
# Em Ruby, podemos criar métodos que terminam com "=, !, ?" | |
def name=(name) | |
@name = name | |
end | |
end | |
doguinho = Dog.new | |
# Chamando o método "name=" | |
doguinho.name=('Mike') | |
doguinho.name # Mike | |
# Entretanto, o Ruby é muito legal e facilita ainda mais a nossa vida com uma condição especial. | |
# Se o método termina com "=", na hora de chamar, podemos colocar um "espaço" e omitir os parênteses. | |
doguinho.name = "Mike" | |
# O Ruby não pára de nos surpreender, e facilita ainda mais dizendo: "olha, se você tem um método setter que | |
# apenas define o valor de uma variável de instância, forneço um método chamado "attr_writer". | |
class Dog | |
# O attr_writer substitui todo o método: | |
# def name=(name) | |
# @name = name | |
# end | |
attr_writer :name | |
def name | |
@name | |
end | |
end | |
doguinho.name = "Mike" | |
doguinho.name # Mike | |
# Além do mais o Ruby fornece um atalho sintático para o método "getter", que busca o valor da variável de instância, o | |
# "attr_reader" | |
class Dog | |
attr_writer :name | |
# O attr_reader substitui todo o método: | |
# def name | |
# @name | |
# end | |
attr_reader :name | |
end | |
doguinho.name = "Spike" | |
doguinho.name # Spike | |
# Inclusive, dá pra adicionar mais métodos "setters" e "getters": | |
class Dog | |
attr_writer :name, :age | |
attr_reader :name, :age | |
end | |
# Caramba Ruby, ainda dá pra melhorar? Sim, o "attr_accessor" é um atalho para o "reader" e "writer" juntos! | |
class Dog | |
attr_accessor :name, :age | |
end | |
mike = Dog.new | |
mike.name = "Mike" | |
mike.age = 1 | |
spike = Spike.new | |
spike.name = "Spike" | |
spike.age = 2 | |
mike.name # Mike | |
mike.age # 1 | |
spike.name # Spike | |
spike.age # 2 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment