Skip to content

Instantly share code, notes, and snippets.

@gbaptista
Last active December 11, 2015 21:18
Show Gist options
  • Save gbaptista/4661126 to your computer and use it in GitHub Desktop.
Save gbaptista/4661126 to your computer and use it in GitHub Desktop.
# 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
# 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