Renato Besen

  www.oncast.com.br
O que é Ruby?




    "Uma linguagem dinâmica, open source com foco na
simplicidade e na produtividade. Tem uma sintaxe elegante de
                leitura natural e fácil escrita."
Como surgiu?
Sintaxe
class ClasseExemplo
   def initialize
     @variavel = "!!!"
   end

  def metodo(p)
     if p.respond_to? :reverse
        puts p.reverse
     end
    puts @variavel
  end
end
Módulos / Mixins
Módulos / Mixins
module M
  def metodo
    puts "Chamada do módulo"
    puts self.upcase
  end
end
Módulos / Mixins
class C < String
   include M
end

a = C.new("yay!")

a.metodo
=>Chamada do módulo
=>YAY!
Tudo é Objeto
Tudo é Objeto
2.even?


class A
   def oi
     puts "Oi!"
   end
end

A.method_defined? :oi
Classes Abertas
Classes Abertas


"With great power must come
     great responsibility"
       - Benjamin "Ben" Parker
Classes Abertas
class String
   def reverse_upcase
      self.reverse.upcase
   end
end

"notlob".reverse_upcase
=> "BOLTON"
method_missing
method_missing
def method_missing(method_id, *arguments)
  if match = matches_dynamic_finder?(method_id)
     finder = determine_finder(match)
     attribute_names = extract_attribute_names_from_match(match)
     # ....
end

def matches_dynamic_finder?(method_id)
  /^find_(all_by|by)_([_a-zA-Z]w*)$/.match(method_id.to_s)
end

http://dev.rubyonrails.org/browser/trunk/activerecord/lib/active_record/base.rb?
rev=9235
Blocos
Blocos
['bla', 'ble', 'bli'].each { |word| word.upcase!}.join(";")
=> "BLA;BLE;BLI"
Blocos
def compara(p,q)
  if block_given?
      yield(p,q)
  else
      p <=> q
  end
end

compara(1, 2)
=> -1
compara(1, 2) {|a,b| a * 5 <=> b}
=> 1
Listas e Hashes
Listas e Hashes

a = [1,2,3]
a << 4
=> [1, 2, 3, 4]

b = {:um => 1, :dois => 2, :tres => 3}
b["quatro"] = 4
Listas e Hashes
a = [1, 2, 3, 4, 5]

a.each {|n| puts n} # itera na lista

b = a.select {|n| n.even?} # seleciona elementos na lista
=> [2, 4]

def fatorial(n)
   (2..n).inject(1) { |result, i| result *= i}
end
Listas e Hashes
a = {1 => "Renato" , 2 => "Andre"}

a.each do |key, name|
  puts key
  if name.end_with "o"
      puts name.upcase
  else
      puts name.downcase
  end
end
Ferramentas
Ferramentas
irb
rubygems
zentest
rspec
rake
rdoc/ri
Como aprender?




Why's (poignant) guide to Ruby

Ruby