18

Click here to load reader

Introdução ao Ruby

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

Page 1: Introdução ao Ruby

rubya programmer’s best friend

Page 2: Introdução ao Ruby

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

Page 3: Introdução ao Ruby

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!" }

Page 4: Introdução ao 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"

Page 5: Introdução ao Ruby

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.

Page 6: Introdução ao Ruby

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

Page 7: Introdução ao Ruby

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

Page 8: Introdução ao Ruby

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

Page 9: Introdução ao Ruby

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

Page 10: Introdução ao Ruby

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

Page 11: Introdução ao Ruby

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!

Page 12: Introdução ao Ruby

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

Page 13: Introdução ao Ruby

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

Page 14: Introdução ao Ruby

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

Page 15: Introdução ao Ruby

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

Page 16: Introdução ao Ruby

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

Page 17: Introdução ao Ruby

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’

Page 18: Introdução ao Ruby

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