Last active
December 11, 2015 21:18
-
-
Save gbaptista/4661126 to your computer and use it in GitHub Desktop.
Como funcionam os attr(*args) em Ruby: http://blog.gbaptista.com/2013/01/29/como-funciona-o-attr_accessor-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
# encoding: utf-8 | |
# Ajuda para os comentários e termos: | |
# http://blog.gbaptista.com/2013/01/29/comentarios-metodos-variaveis-classe-instancia/ | |
class WithAttr | |
# Métodos [instance public] de leitura e/ou escrita para as variáveis. | |
attr_accessor :boy, :girl, :dog | |
attr_reader :man | |
attr_writer :woman | |
# Valor pré-definido para a variável [class]. | |
@wolf = { 'name' => 'Wolfão' } | |
# Métodos [class public] de leitura e/ou escrita para as variáveis. | |
class << self | |
attr_accessor :wolf, :cat, :fish | |
attr_reader :lion | |
attr_writer :bird | |
end | |
def initialize | |
# Valor pré-definido para a variável [instance]. | |
self.dog = { 'name' => 'Dogão' } | |
end | |
end | |
class WithoutAttr | |
# Métodos [instance public] de leitura e/ou escrita para as variáveis. | |
def boy | |
@boy | |
end | |
def boy=(value) | |
@boy = value | |
end | |
def girl | |
@girl | |
end | |
def girl=(value) | |
@girl = value | |
end | |
def dog | |
@dog | |
end | |
def dog=(value) | |
@dog = value | |
end | |
def man | |
@man | |
end | |
def woman=(value) | |
@woman = value | |
end | |
# Valor pré-definido para a variável [class]. | |
@wolf = { 'name' => 'Wolfão' } | |
# Métodos [class public] de leitura e/ou escrita para as variáveis. | |
def self.wolf | |
@wolf | |
end | |
def self.wolf=(value) | |
@wolf = value | |
end | |
def self.cat | |
@cat | |
end | |
def self.cat=(value) | |
@cat = value | |
end | |
def self.fish | |
@fish | |
end | |
def self.fish=(value) | |
@fish = value | |
end | |
@lion = nil | |
def self.lion | |
@lion | |
end | |
def self.bird=(value) | |
@bird = value | |
end | |
def initialize | |
# Valor pré-definido para a variável [instance]. | |
self.dog = { 'name' => 'Dogão' } | |
end | |
end |
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
# encoding: utf-8 | |
# Ajuda para os comentários e termos: | |
# http://blog.gbaptista.com/2013/01/29/comentarios-metodos-variaveis-classe-instancia/ | |
require 'test/unit' | |
require './attr' | |
class AttrTest < Test::Unit::TestCase | |
# Os testes abaixo provam que ambas as classes | |
# possuem exatamente os mesmos métodos e comportamento. | |
def test_instance_attr | |
# Ambas as classes possuem os mesmos métodos [instance]. | |
assert_equal(WithoutAttr.instance_methods.sort, WithAttr.instance_methods.sort) | |
[WithoutAttr.new, WithAttr.new].each do |instance| | |
# @boy e @girl [instance public] possuem leitura e escrita. | |
assert_equal({'name' => 'Guilherme'}, instance.boy=({'name' => 'Guilherme'})) | |
assert_equal('Guilherme', instance.boy['name']) | |
assert_equal('Jonh', instance.boy['name']=('Jonh')) | |
assert_equal(2, instance.boy['age']=(2)) | |
assert_equal(2, instance.boy['age']) | |
assert_equal('Jonh', instance.boy['name']) | |
assert_equal({}, instance.girl=({})) | |
assert_equal('Megan', instance.girl['name']=('Megan')) | |
assert_equal('Megan', instance.girl['name']) | |
# @man [instance public] possui apenas leitura. | |
assert_equal(nil, instance.man) | |
assert_match(/undefined method/, assert_raise(NoMethodError){ | |
instance.man = {} | |
}.message) | |
# @woman [instance public] possui apenas escrita | |
assert_match(/undefined method/, assert_raise(NoMethodError){ | |
instance.woman | |
}.message) | |
assert_equal( {'name' => 'Zooey'}, instance.woman = {'name' => 'Zooey'} ) | |
# @dog [instance public] possui valores pré-definidos. | |
assert_equal('Dogão', instance.dog['name']) | |
assert_equal('Dogona', instance.dog['name']='Dogona') | |
assert_equal(3, instance.dog['age']=3) | |
assert_equal(3, instance.dog['age']) | |
assert_equal('Dogona', instance.dog['name']) | |
end | |
end | |
def test_class_attr | |
# Ambas as classes possuem os mesmos métodos [class]. | |
assert_equal(WithoutAttr.methods.sort, WithAttr.methods.sort) | |
[WithoutAttr, WithAttr].each do |class_attr| | |
# @cat e @fish [class public] possuem leitura e escrita. | |
assert_equal({'name' => 'Guilherme'}, class_attr.cat=({'name' => 'Guilherme'})) | |
assert_equal('Guilherme', class_attr.cat['name']) | |
assert_equal('Jonh', class_attr.cat['name']=('Jonh')) | |
assert_equal(2, class_attr.cat['age']=(2)) | |
assert_equal(2, class_attr.cat['age']) | |
assert_equal('Jonh', class_attr.cat['name']) | |
assert_equal({}, class_attr.fish=({})) | |
assert_equal('Megan', class_attr.fish['name']=('Megan')) | |
assert_equal('Megan', class_attr.fish['name']) | |
# @lion [class public] possui apenas leitura. | |
assert_equal(nil, class_attr.lion) | |
assert_match(/undefined method/, assert_raise(NoMethodError){ | |
class_attr.lion = {} | |
}.message) | |
# @bird [class public] possui apenas escrita | |
assert_match(/undefined method/, assert_raise(NoMethodError){ | |
class_attr.bird | |
}.message) | |
assert_equal( {'name' => 'Zooey'}, class_attr.bird = {'name' => 'Zooey'} ) | |
# @wolf [class public] possui valores pré-definidos. | |
assert_equal('Wolfão', class_attr.wolf['name']) | |
assert_equal('Wolfona', class_attr.wolf['name']='Wolfona') | |
assert_equal(3, class_attr.wolf['age']=3) | |
assert_equal(3, class_attr.wolf['age']) | |
assert_equal('Wolfona', class_attr.wolf['name']) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment