Академический Документы
Профессиональный Документы
Культура Документы
do Básico ao Avançado
Aula 01
Introdução ao Ruby,
Instalação e Linguagem 1
Curso online de Ruby On Rails
Esperamos que você não só aprenda como também se divirta bastante. Tanto
o Ruby quanto o Rails foram inventados por seus criadores não só para facilitar
suas vidas, mas também para retornar aos programadores o conceito de que a
programação, mesmo sendo o seu trabalho diário, pode ser divertida.
Sendo assim, abra o seu editor, escreva algum código e tenha um bom tempo
conosco!
História
Um curso de Ruby on Rails não poderia começar em outro lugar que não seja a
própria linguagem no qual o mesmo foi escrito. Sendo assim, começamos pelo
Ruby.
O sucesso atual do Ruby se deve, sem dúvida ao Rails. Sem o Rails, é provável
que o Ruby tivesse surgido eventualmente no cenário central das linguagens
de programação, mas sem todo o hype e visibilidade que o mesmo possui
atualmente. O que teria sido uma pena já que o Ruby, como mencionado
acima, é uma ferramenta fantástica não só para desenvolvimento Web mas
também para a miríade de tarefas que um programador precisa executar do
seu dia-a-dia.
Tudo isso dito, não se pode extrair a conclusão de que o Ruby seja a
linguagem perfeita. Como qualquer linguagem, o Ruby tem suas vantagens e
desvantagens e deve ser usada apropriadamente. Ainda assim, como
esperamos mostrar durante o curso, escolher o Ruby como uma linguagem a
mais para o seu currículo é algo que pode beneficiar qualquer programador.
Características
Até o momento não falamos das características do Ruby. Para isso, vamos usar
as palavras do seu próprio criador. Em uma tradução livre, ele diz o seguinte:
Usando ainda o mesmo texto do qual a citação anterior foi extraída, Matz diz o
seguinte sobre as características do Ruby:
1 http://www2.ruby-lang.org/en/20020101.html
Criado por e-Genial Soluções Inteligentes – Todos os direitos reservados. 4
Curso online de Ruby On Rails
− Todas as classes e objetos são abertos. Isso significa que mesmo as classes
básicas como String (que representa informação textual) e Fixnum (que
representa números inteiros) podem ser alteradas pelo programador.
Significa também que instâncias de uma classe podem ser modificadas para
se comportar diferentemente de outras instâncias. Finalmente, significa que
qualquer coisa pode ser redefinida. É possível, por exemplo, redefinir
operações matemáticas e criação de instâncias.
− Ruby possui closures 2 reais. Closures são funções que carregam consigo o
contexto no qual foram criadas. Isso permite programação e meta-
programação em um nível muito acima da maioria das linguagens
imperativas comuns. Significa também que você pode passar funções como
parâmetros, aumentando a capacidade da linguagem da forma que for
necessária.
− Ruby possui blocos de execução de código que podem ser passados para
métodos como parâmetros ou convertidos em closures.
2 http://en.wikipedia.org/wiki/Closure_%28computer_science%29
3 http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29
Criado por e-Genial Soluções Inteligentes – Todos os direitos reservados. 5
Curso online de Ruby On Rails
Vantagens e Desvantagens
Para citar duas delas, o Ruby possui sua própria implementação interna de
threading4 . Embora isso a torne portável a todas plataformas onde o Ruby
está, significa também o Ruby não consegue aproveitar tão bem sistemas
multi-processados sem esforço por parte do programador e que certas
condições de travamento e concorrência são mais difíceis de serem prevenidas.
Agora que conhecemos mais do Ruby, podemos passar para o aspecto prático
que é a instalação do mesmo. Aqui começa a nossa aventura. Mais uma vez,
divirta-se!
4 http://en.wikipedia.org/wiki/Green_threads
Criado por e-Genial Soluções Inteligentes – Todos os direitos reservados. 7
Curso online de Ruby On Rails
Instalação
Mac OS X
Agora podemos atualizar as Gems. O Rails é uma Gem, então com o comando
baixo também baixamos e atualizamos o Rails para sua última versão
(atualmente 2.3.5):
Linux
Parece muita coisa porém apenas 4 destes pacotes são obrigatórios, mas já
estou instalando os que provavelmente você irá utilizar no dia a dia do
desenvolvimento Ruby. Um dos pacotes instala o mysql, caso você ainda não o
tenha feito ele irá pedir para escolher uma senha.
Concluído o passo acima, agora precisamos instalar o RubyGems, que não vem
por padrão no pacote. Execute os comandos a baixo, um a cada vez:
wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
tar xvzf rubygems-1.3.5.tgz
cd rubygems-1.3.5
sudo ruby setup.rb
Agora é necessário criar alguns links para que o comando gem esteja acessível
de qualquer local do sistema:
Windows
Mas existe o pequeno porem que o One Click Installer instala o Ruby 1.8.6. Se
você desejar atualiza-lo para o 1.8.7 acesse o site do Ruby em Downloads
(http://www.ruby-lang.org/en/downloads/) e baixe o Ruby 1.8.7 binário, em
seguida descompacte-o na pasta onde o Ruby One Click Installer colocou o
Ruby, sobre-escrevendo seu conteúdo.
gem update
Concluido este passo também precisamos instalar o SQLite, que para facilitar
prototipagem rápida, é o banco escolhido por padrão pelo Rails.
Testando a Instalação
ruby -v
A resposta será versão do Ruby que acabamos de instalar, você pode também
checar a versão do Rails com o comando rails -v .
Para sair do IRB digite quit ou exit. Agora vamos criar o primeiro aplicativo
Rails, também no console digite o comando abaixo:
rails nome_do_projeto
Se você instalou tudo corretamente o Rails vai gerar uma série de arquivos
dentro da pasta do nome_projeto que você escolheu. Navegue para dentro
desta pasta e digite:
ruby script/server
Editores e IDE’s
Qual ferramenta utilizar é um tema que sempre gera bastante discussão, pois
diferente de outras linguagens o Ruby não exige o uso de uma IDE. No
desenvolvimento Ruby, a única coisa que é realmente essencial é uso do
console para fazer chamadas simples como fizemos acima.
No mundo Ruby o uso de IDE’s não é comum pois como a linguagem é bem
simples, você não terá dificuldades para decorar os comandos e conhecer a API
do Ruby. Outro fator que diminui a popularidade de IDE’s é que por ser uma
linguagem interpretada não é necessário compilar e nunca será possível
conseguir um auto-complete perfeito por ser dinâmica. IDE’s no mundo Ruby
também perdem o valor rapidamente pois tanto a linguagem como os
frameworks estilo o Rails são atualizados com frequencia, o que faz com que
as IDE’s parem de funcionar.
console, criando wizards que fazem o mesmo que os comandos simples que
executamos no terminal, tornando o desenvolvedor dependente da IDE e sem
entender o que realmente está acontecendo.
O que a maioria dos Rubistas mais experientes utilizam são editores de textos
mais robustos que permitem colorização, snippets e automatização de tarefas.
Mas se você não abre mão de uma IDE a mais recomendada é o RubyMine
(http://www.jetbrains.com/ruby/) mas também pode ser usado o Netbeans,
Aptana ou Eclipse.
A Linguagem
irb(main):001:0> a = 1
=> 1
irb(main):002:0> a = "1"
=> "1"
irb(main):001:0> a = 1
=> 1
irb(main):002:0> a.class
=> Fixnum
irb(main):003:0> a = "1 "
=> "1 "
irb(main):004:0> a.class
=> String
Note que mesmo tipos primitivos como o número inteiro 1 são membros de
uma classe—no caso Fixnum, que é a classe que define números com
representação fixa.
irb(main):001:0> 1.class
=> Fixnum
irb(main):002:0> 1.class.class
=> Class
irb(main):003:0> 1.class.superclass
=> Integer
irb(main):004:0>
Note que 1 é uma instância da classe Fixnum. A classe Fixnum, por sua vez, é
também um objeto, uma instância da classe Class, que define todas as classes
em Ruby. Class é chamada a metaclasse de Fixnum, ou seja, é uma classe que
descreve uma classe. Na terceira linha temos outro conceito de orientação a
objetos que é a superclasse de uma classe, ou seja, a classe da qual a mesma
é derivada. No caso de Fixnum, temos a seguinte hierarquia: Object =>
Numeric => Integer => Fixnum.
Exercício 1
irb(main):001:0> 1.to_s
=> "1"
irb(main):002:0> 1 + 1
=> 2
irb(main):003:0> 1.+(1)
=> 2
irb(main):004:0> -1.abs
=> 1
irb(main):005:0> "123".length
=> 3
Uma maneira fácil de visualizar os métodos que uma classe possui é chamar o
seu método methods, como pode ser visto abaixo:
~$ irb
irb(main):001:0> 1.methods
=> ["%", "inspect", "<<", "singleton_method_added", "&", "clone", ">>", "ceil",
"public_methods", "instance_variable_defined?", "div", "equal?", "freeze",
"times", "*", "+", "to_i", "methods", "respond_to?", "-", "upto", "between?",
"prec", "round", "/", "method", "dup", "instance_variables", "__id__", "divmod",
"chr", "succ", "|", "eql?", "integer?", "~", "id", "to_f", "singleton_methods",
~$ irb
irb(main):001:0> String.public_methods
=> ["inspect", "private_class_method", "const_missing", "clone",
"public_methods", "public_instance_methods", "instance_variable_defined?",
"method_defined?", "superclass", "equal?", "freeze", "included_modules",
"const_get", "autoload?", "methods", "respond_to?", "module_eval",
"class_variables", "method", "dup", "protected_instance_methods",
"instance_variables", "public_method_defined?", "__id__", "eql?", "const_set",
"id", "singleton_methods", "send", "class_eval", "taint", "frozen?",
"instance_variable_get", "include?", "private_instance_methods", "__send__",
"instance_of?", "private_method_defined?", "to_a", "object_id", "name", "type",
"new", "<", "protected_methods", "instance_eval", "<=>", "==", ">", "===",
"instance_variable_set", "kind_of?", "extend", "protected_method_defined?",
"const_defined?", ">=", "ancestors", "to_s", "<=", "public_class_method",
"autoload", "allocate", "hash", "class", "instance_methods", "tainted?", "=~",
"private_methods", "class_variable_defined?", "display", "nil?",
"instance_method", "untaint", "constants", "is_a?"]
Aqui cabe uma explicação sobre uma diferença do Ruby para outras linguagens
orientadas a objetos.
~$ irb
irb(main):001:0> a = "Uma string qualquer"
=> "Uma string qualquer"
irb(main):002:0> b = String.new("Uma string qualquer")
=> "Uma string qualquer"
irb(main):003:0> a == b
=> true
irb(main):004:0> require 'date'
=> true
irb(main):005:0> d = Date.new(2007, 1, 1)
=> #<Date: 4908203/2,0,2299161>
irb(main):006:0> d.day
=> 1
irb(main):007:0> d.year
=> 2007
Note que nas primeiras declarações criamos uma string de maneira implícita e
de maneira explícita. Uma comparação entre as duas revela que não há
diferença na criação, ou seja, a criação implícita é essencialmente o mesmo
que uma chamada ao método new seguida de uma atribuição.
Como podemos notar de tudo o que foi visto acima, o Ruby é realmente uma
linguagem orientada a objetos em toda a sua extensão. Todo valor criado é
uma instância de uma classe qualquer, mesmo as próprias classes.
Exercício 2
class Entity
end
O código acima define uma classe chamada Entity que possui um método
chamado initialize. Esse método possui uma conotação especial em Ruby,
sendo o método que é invocado quando a instância de uma classe é criada
(também conhecido como construtor). Vejamos isso em um exemplo:
Note que o Ruby fornece uma representação interna do objeto para fácil
visualização. Na representação acima, a classe do objeto é exibida, seguida de
seu endereço em memória. Depois, temos as variáveis internas do objeto com
seus valores. Você deve estar se perguntando o que os dois pontos na frente
de um nome—como :hobbit, por exemplo—significam. Nomes atribuídos assim
são chamados de símbolos e veremos mais sobre eles adiante. Por hora, basta
dizer que são representações eficientes de um valor qualquer.
Note que se você tentar extrair o valor de uma variável de instância acima,
você verá um erro. Por exemplo:
irb(main):001:0> samwise.name
NoMethodError: undefined method `name' for #<Entity:0xb7d634c4 @name="Samwise
Gamgi", @type=:hobbit>
from (irb):11
from :0
Falando em métodos, podemos criar um método para a nossa classe para ver
com os mesmos funcionam. Para isso, vamos substituir a inconveniente
representação textual acima por uma de nosso interesse. Isso é feito criando
um método chamado to_s, que já mencionamos anteriormente. Esse método
converte um objeto qualquer em sua representação textual. Todos objetos em
Ruby possuem esse método, embora sua implementação inicial seja bem
limitada.
irb(main):001:0> samwise.to_s
=> "#<Entity:0xb7d634c4>"
Podemos sobrescrever o método assim:
class Entity
end
Criado por e-Genial Soluções Inteligentes – Todos os direitos reservados. 20
Curso online de Ruby On Rails
Note que to_s agora é usado implicitamente onde uma representação textual
de um objeto é exigida. Uma pequena exceção é a exibição do objeto no irb,
onde to_s não é invocado diretamente para prover detalhes de implementação.
Note que no final, ao invocarmos puts, o valor é impresso na tela e nil é
retornado. Isso ocorre porque puts envia seus parâmetros à saída padrão e
retorna nil, ou seja, não retorna nada específico.
class Entity
def name
@name
end
def type
@type
end
def name=(value)
@name = value
end
def type=(value)
@type = value
end
end
Isso permite o seguinte código:
Note que agora temos métodos que podemos usar para obter ou mudar o valor
de um atributo do objeto. Os métodos que mudam o valor possuem um sinal
de igual (=) em seu nome e são usados automaticamente pelo Ruby em caso
de atribuição como o exemplo demonstra.
Exercício 3
Como classes também são instâncias, elas podem ter métodos e atributos.
Digamos que precisamos saber todas os tipos já usados em entidades.
Podemos ter algo assim:
class Entity
@@types = []
@type = type
@name = name
end
# ...
def self.types
@@types
end
end
class Test
public
def method1
end
protected
def method2
end
private
def method3
end
end
class Test
def method1
end
def method2
end
def method3
end
public :method1
protected :method2
private :method2
end
class B < A
end
Exercício 4
Respostas
Exercício 1
1. Object
2. Class
Exercício 2
1. Retorna um identificador numérico único para o objeto.
2. Temos o mesmo object_id para cada variável, isso ocorre pois
números inteiros são Fixnum’s com o mesmo id.
3. Cada objeto possui um object_id diferente pois cada instância da
class String faz referência para uma posição diferente.
Exercício 3
1. Não
2. Poderia ser utilizado o método attr_accessor para criar getter e
setter para os valores passados. Como abaixo:
attr_acessor :name, :type
Exercício 4
1. Este método será sobre-escrito.
2. Basta chamar o método normalmente de dentro da subclasse.