109 lines
4.0 KiB
Markdown
109 lines
4.0 KiB
Markdown
|
---
|
|||
|
title: Classes and Objects
|
|||
|
localeTitle: Classes e Objetos
|
|||
|
---
|
|||
|
## Classes e Objetos
|
|||
|
|
|||
|
### Objetos em Ruby
|
|||
|
|
|||
|
Vamos rapidamente examinar os objetos Ruby. No mundo real, objetos podem ser qualquer coisa, incluindo um carro, computador ou até mesmo um humano. Cada um desses objetos tem um estado e comportamentos.
|
|||
|
|
|||
|
Considerando um carro, seu estado poderia ser descrito como seu modelo, marca e cor. O comportamento do carro pode estar girando, buzinando ou freando.
|
|||
|
|
|||
|
Um objeto em Ruby tem características muito semelhantes. Objetos Ruby também possuem um estado e comportamento. Em Ruby Objects, o estado é armazenado em variáveis de instância e o comportamento é armazenado em funções.
|
|||
|
|
|||
|
### Classes em Ruby
|
|||
|
|
|||
|
Uma classe é basicamente um modelo de programa. Este modelo define as `properties` iniciais usando `instance variables` . Novamente, também existem novamente `behaviors` definidos na forma de funções.
|
|||
|
|
|||
|
Uma nova instância de uma classe é criada usando o método `initialize` de uma classe.
|
|||
|
|
|||
|
Tomemos por exemplo o seguinte código de amostra de uma classe:
|
|||
|
|
|||
|
```Ruby
|
|||
|
class Car
|
|||
|
def initialize(make, model, color)
|
|||
|
@make = make
|
|||
|
@model = model
|
|||
|
@color = color
|
|||
|
end
|
|||
|
|
|||
|
def turn(direction)
|
|||
|
end
|
|||
|
|
|||
|
def honk
|
|||
|
puts "beep beep"
|
|||
|
end
|
|||
|
|
|||
|
def brake
|
|||
|
end
|
|||
|
end
|
|||
|
```
|
|||
|
|
|||
|
Como você viu, as classes são definidas usando a palavra-chave `class` e o bloco do código da classe termina com um keywork `end` . A função `.initialize` é o construtor. Quando criamos este objeto, definimos os atributos `@make` , `@model` e `@color` com os valores que passamos para o construtor.
|
|||
|
|
|||
|
### Criando uma instância de uma classe
|
|||
|
|
|||
|
Agora, para criar uma instância dessa classe, você só precisa chamar a função `.new` .
|
|||
|
|
|||
|
```Ruby
|
|||
|
mazda3 = Car.new('Mazda', 'Mazda3', 'White')
|
|||
|
```
|
|||
|
|
|||
|
Isso é ótimo, mas às vezes você pode precisar alterar alguns desses atributos! A maioria desses atributos neste exemplo seria estática. Ainda assim, imagine que você decidiu fazer uma nova pintura. Como você faria para atualizar o estado dessa instância do objeto `Car` ?
|
|||
|
|
|||
|
### Modificando o Estado da Instância
|
|||
|
|
|||
|
Felizmente, é bastante simples atualizar o estado de um objeto. Primeiro, precisaríamos de um método `setter` ! Ruby define as configurações **getter** e **setter** como `attr_reader` e `attr_accessor` respectivamente. Para as configurações de getter e setter em um determinado atributo, você também pode usar apenas `attr_accessor` .
|
|||
|
|
|||
|
Para demonstrar isso, modifiquei o objeto Car anterior com essas configurações recém-definidas.
|
|||
|
|
|||
|
```Ruby
|
|||
|
class Car
|
|||
|
attr_accessor :color
|
|||
|
attr_reader :make, :model
|
|||
|
|
|||
|
def initialize(make, model, color)
|
|||
|
@make = make
|
|||
|
@model = model
|
|||
|
@color = color
|
|||
|
end
|
|||
|
|
|||
|
def turn(direction)
|
|||
|
end
|
|||
|
|
|||
|
def honk
|
|||
|
puts "beep beep"
|
|||
|
end
|
|||
|
|
|||
|
def brake
|
|||
|
end
|
|||
|
end
|
|||
|
```
|
|||
|
|
|||
|
Então agora podemos mudar o estado e ler o estado do objeto.
|
|||
|
|
|||
|
```Ruby
|
|||
|
irb(main):023:0> c = Car.new('Mazda', 'Mazda3', 'White')
|
|||
|
=> #<Car:0x00007fd3ca13fdd0 @make="Mazda", @model="Mazda3", @color="White", @speed=nil>
|
|||
|
irb(main):024:0> c.color
|
|||
|
=> "White"
|
|||
|
irb(main):025:0> c.make
|
|||
|
=> "Mazda"
|
|||
|
irb(main):026:0> c.model
|
|||
|
=> "Mazda3"
|
|||
|
irb(main):027:0> c.color = 'Brutal Blue'
|
|||
|
=> "Brutal Blue"
|
|||
|
irb(main):028:0> c.make = 'Prius'
|
|||
|
Traceback (most recent call last):
|
|||
|
2: from /usr/local/bin/irb:11:in `<main>'
|
|||
|
1: from (irb):28
|
|||
|
NoMethodError (undefined method `make=' for #<Car:0x00007fd3ca13fdd0>)
|
|||
|
Did you mean? make
|
|||
|
```
|
|||
|
|
|||
|
Visualizando a saída anterior do `irb` , você pode ver que cada uma das variáveis da instância é legível. Podemos escrever para `@color` , mas acabamos causando uma exceção `NoMethodError` quando tentamos gravar no `@make` . Isto é porque `@make` foi definido apenas usando um `attr_reader` , então `make=` não está definido.
|
|||
|
|
|||
|
### Recursos
|
|||
|
|
|||
|
* [Programação Ruby / Sintaxe / Classes](https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes)
|