Click here to load reader
Upload
milton-moura
View
3.855
Download
0
Embed Size (px)
DESCRIPTION
slides de uma pequena acção de formação com o objectivo de introduzir a linguagem de programação ruby
Citation preview
rubya programmer’s best friend
introdução ao rubyíndice de conteúdos
http://www.ruby-lang.org/pt/
i n t r o d u ç ã o
f e r r a m e n t a s c l i
n o m e n c l a t u r a & t i p o s d e d a d o s
m ó d u l o s & c l a s s e s
b l o c o s & i t e r a d o r e s
e x c e p ç õ e s & i n t r o s p e c ç ã o
r u b y g e m s
introdução ao rubya linguagem de programação
:definir => “linguagem”
:definir => “origem”
http://www.ruby-lang.org/pt/
criada em 1995 no Japão, por Yukihiro Matsumoto
licenciada sob a GPL – Free Software
= +
multi-plataforma (Windows, Linux, MacOS X, *BSD)
dinâmicalinguagem de alto nível, interpretada no momento de execução – facilita a extensão dos programas, através da modificação dos objectos durante o período de execução
reflectivacapacidade de introspecção – permite a análise e alteração da estrutura e comportamento do programa
orientada a objectos – “everything is an object”
5.times { print “Eu *adoro* Ruby!" }
4
introdução ao rubyo exemplo clássico
http://www.ruby-lang.org/pt/
:definir => “hello world #1”
$ ruby -e "puts 'Hello World'"
:definir => “hello world #2”
$ ruby -e "def hello_world; puts 'Hello World'; end; hello_world"
:definir => “hello world #3”
$ ruby -e "class HelloWorld; def initialize; puts 'Hello World'; end; end; HelloWorld.new"
introdução ao rubyferramentas CLI
http://www.ruby-lang.org/pt/
:definir => “ri”
:definir => “irb”
interactive rubyshell interactiva, útil para testar pequenos programas ou avaliar expressões rapidamente
steel:~ mgcm$ irbirb(main):001:0> def soma(n1, n2)irb(main):002:1> n1 + n2irb(main):003:1> end=> nilirb(main):004:0> soma(2, 3)=> 5irb(main):005:0>
ruby informationinterface de linha de comando para a documentação do Ruby -- classes, módulos, etc
steel:~ mgcm$ ri IO#puts Writes the given objects to _ios_ as with +IO#print+. Writes a record separator (typically a newline) after any that do not already end with a newline sequence. If called with an array argument, writes each element on a new line. If called without arguments, outputs a single record separator.
introdução ao rubyconceitos base - variáveis
http://www.ruby-lang.org/pt/
variáveis locais
:definir => “nomenclatura das variáveis”
variáveis globais e constantes
foo = “bar“a_minha_variavel_com_o_valor_pi = 3.1415
$foo = “bar_global“$COS_PI = Math.cos(Math::PI)
classes , variáveis de instância e variáveis de classe
class MyClass def initialize @@my_class_variable = Hash.new @my_instance_variable = Array.new endend
introdução ao rubyconceitos base - estruturas de dados
http://www.ruby-lang.org/pt/
:definir => “tipos de dados”
irb(main):001:0> a = []=> []irb(main):002:0> a.class=> Arrayirb(main):003:0> a, b = [1, 2], [3, 4] => [[1, 2], [3, 4]]irb(main):004:0> a + b=> [1, 2, 3, 4]
vectores
irb(main):001:0> h = {}=> {}irb(main):002:0> h.class=> Hashirb(main):003:0> h = {:key => “value”}irb(main):004:0> h.values=> [”value”]irb(main):005:0> h.keys=> [:key]
hashes
irb(main):001:0> 1.class=> Fixnumirb(main):002:0> 2.0.class=> Floatirb(main):003:0> “3.1415”.class=> String
inteiros, reais e strings
irb(main):001:0> 1..100.class=> Rangeirb(main):003:0> /^ruby/.class=> Regexp
intervalos e expressões regulares
8
introdução ao rubyconceitos base - fluxo
http://www.ruby-lang.org/pt/
:definir => “controlo de execução”
if count > 10puts “maior de 10”
elsif i == 3puts “igual a três”
elseputs “outra coisa qq”
end
if-elsif-else-end
while i < 100 and count > 0fazer_algo_utili += 1
end
while
unless i > 5puts “i menor do que 5”
end
unless
puts “i maior do que 5” if i > 5i = i + 1 while i < 100puts “i menor do que 5” unless i > 5
formas concisas
for i in 0..100total += i
end
forcase my_stringwhen “hello” then puts “world”when “goodbye” then puts “cruel world”
end
case
until a == truea = false
end
until
introdução ao rubyconceitos base - oop
http://www.ruby-lang.org/pt/
:definir => “classes”
class ContaBancariaattr_reader :saldo
def initialize(saldo_inicial)@saldo = saldo_inicial
end
def credito(valor)@saldo += valor
end
def debito(valor)@saldo -= valor if (@saldo - valor) > 0
end
def to_s"A sua conta tem um saldo de € #{@saldo}"
endend
irb(main):001:0> load “conta.rb”=> trueirb(main):002:0> c = ContaBancaria.new 123=> #<ContaBancaria:0x386198 @saldo=123>irb(main):003:0> c.credito 150=> 273irb(main):004:0> c.debito 99=> 174irb(main):005:0> puts cA sua conta tem um saldo de € 174=> nil
conta.rb irb
introdução ao rubyconceitos base - herança
http://www.ruby-lang.org/pt/
:definir => “herança simples”
class ContaOrdenado < ContaBancariaattr_reader :saldo, :plafond
def initialize(saldo_inicial, plafond)super(saldo_inicial)@plafond = plafond if plafond <= ContaOrdenado.plafond_maximo
end
def debito(valor)@saldo -= valor if (@saldo - valor) > plafond
end
def ContaOrdenado.plafond_maximo10000
endend
irb(main):001:0> ContaOrdenado.plafond_maximo=> 10000irb(main):002:0> c = ContaBancaria.new 123=> #<ContaBancaria:0x386198 @saldo=123>irb(main):003:0> o = ContaOrdenado.new 0, 100=> #<ContaOrdenado:0x343280 @saldo=0, @plafond=100>irb(main):004:0> c.class=> ContaBancariairb(main):005:0> o.class=> ContaOrdenado
conta.rb
irb
introdução ao rubyconceitos base - módulos
http://www.ruby-lang.org/pt/
:definir => “módulos”
Módulos::Namespacessão uma forma lógica de agrupar métodos, classes e constantes. Permitem:
‣ o agrupamento em namespaces, evitando assim colisções de nomes
module TrigPI = 3.141592654
def Trig.sin(x)# ...
end
def Trig.cos(x)# ...
end
...end
irb(main):001:0> require ‘trig’=> trueirb(main):002:0> y = Trig.sin(Trig::PI/4)=> 0.707106781186548
Ao contrário de uma classe, um módulo não pode ser instanciado!
introdução ao rubyconceitos base - mixins
http://www.ruby-lang.org/pt/
:definir => “módulos”
Módulos::Mixinssão uma forma lógica de agrupar métodos, classes e constantes. Permitem:
‣ a criaçao de mixins, uma técnica que substitui a herança múltipla de classes, através da inclusão de módulos em classes
module Observabledef observers
@observer_list ||= []end
def add_observer(obj)observers << obj
end
def notify_observersobservers.each { |o| o.update }
endend
class TVChannelinclude Observable
def subscribe(client)add_observer(client)
endend
13
introdução ao rubyconceitos base - novos conceitos
http://www.ruby-lang.org/pt/
:definir => “blocos e iteradores”
for i in 0..my_array.lengthreturn my_array[i] if my_array[i] == “ruby”
endmy_array.find { |item| item == “ruby” }
blococonjunto de instruções cujo controlo de execução é passado a um método invocado, tipicamente iterador
10.times { |i| print i, “ ” }
10.times do |i|print i, “ “
end
iteradorum método que pode invocar um bloco de código
class Arraydef find
for i in 0..sizevalue = self[i]return value if yield(value)
endreturn nil
endend
introdução ao rubyconceitos base - erros
http://www.ruby-lang.org/pt/
:definir => “excepções”
begin# código sensível
rescue Exception => exputs “Erro: #{ex.message}”# código que trata a excepção caso esta ocorra
ensure# código a executar após a ocorrência da excepção
end
tratamento de excepções
def o_meu_metodo(valor)raise “Não aceito valores negativos” if valor < 0
end
levantamento de excepções
introdução ao rubyreflexão e introspecção
http://www.ruby-lang.org/pt/
:definir => “introspecção”
com recurso aos mecanismos de introspecção existentes no Ruby, é possível analisar um programa em execução e descobrir:
‣ quais os objectos que este contêm‣ a hierarquia das classes desses objectos‣ os atributos e métodos desses objectos‣ extender e alterar os módulos e classes do programa em execução
irb(main):043:0> 123.methods=> ["%", "inspect", "send", "<<", "prec_i", "divmod", "&", "clone", ">>", "integer?", "chr", "public_methods", "__send__", "equal?", "freeze", "*", "+", "truncate", "to_f", "methods", "instance_eval", "-", "modulo", "prec_f", "zero?", "to_int", "/", "size", "dup", "instance_variables", "extend", "instance_of?", "next", "|", "eql?", "hash", "~", "id", "step", "singleton_methods", "remainder", "taint", "nonzero?", "id2name", "frozen?", "instance_variable_get", "^", "method", "kind_of?", "floor", "to_a", "+@", "-@", "quo", "display", "type", "**", "downto", "<", "protected_methods", "<=>", "==", "abs", ">", "===", "to_sym", "instance_variable_set", "coerce", "is_a?", "ceil", ">=", "respond_to?", "upto", "between?", "to_s", "<=", "prec", "div", "singleton_method_added", "object_id", "times", "class", "tainted?", "=~", "private_methods", "__id__", "nil?", "succ", "untaint", "[]", "round", "to_i"]
métodos de um objecto Fixnum
introdução ao rubyreflexão e introspecção
http://www.ruby-lang.org/pt/
:definir => “introspecção”
irb(main):001:0> ContaBancaria.new(100).respond_to?("plafond")=> falseirb(main):002:0> ContaOrdenado.new(100,10).respond_to?("plafond")=> trueirb(main):003:0> 123.class=> Fixnumirb(main):004:0> 123.instance_of?(Fixnum)=> trueirb(main):005:0> ContaOrdenado.superclass=> ContaBancariairb(main):006:0> ContaOrdenado.ancestors=> [ContaOrdenado, ContaBancaria, Object, Kernel]irb(main):064:0> ContaOrdenado.singleton_methods=> ["plafond_maximo"]
... instance_methods, instance_variables, class_variables, constants, etc...
outras funcionalidades
introdução ao rubybibliotecas de código
http://www.ruby-lang.org/pt/
:definir => “gems”
RubyGemssão formas de distribuir e instalar aplicações e bibliotecas de código ruby, alojadas em repositórios centrais
Exemplos:
‣ rake - uma espécie de Make para Ruby‣ ruby-net-ldap - cliente LDAP para ruby‣ rails - plataforma de desenvolvimento web‣ etc...
‣ mais de 2000 disponíveis online: $ gem list --remote
require ‘rubygems’require ‘gem_xyz’
introdução ao rubyexercício prático
http://www.ruby-lang.org/pt/
:definir => “exercícios”
valores.csv
‣ guardar num vector todos os frutos distintos e ordenar por ordem alfabética
‣ criar em tempo de execução um objecto para cada uma das linhas, cuja classe seja do tipo da fruta adequada
formato: fruto, unidades, preço unitário