Skip to content

Instantly share code, notes, and snippets.

@leandronsp
Created June 4, 2022 20:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leandronsp/6cb73bf805ab66f31953a51c8657ae56 to your computer and use it in GitHub Desktop.
Save leandronsp/6cb73bf805ab66f31953a51c8657ae56 to your computer and use it in GitHub Desktop.
Entendendo attr_accessor, writer e reader no Ruby
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