Ruby é uma linguagem de programação dinâmica e interpretada criada em 1993 por Yukihiro Matsumoto, com grande ênfase na produtividade do programador. Possui tipagem dinâmica forte e tudo é tratado como objeto, incluindo números e strings. Classes podem herdar atributos de outras classes e métodos podem ser definidos para objetos, classes e módulos. O documento apresenta diversos recursos da linguagem como arrays, hashes, expressões condicionais e laços de repetição.
28. 2 + “3” # => TypeError: String can’t be coerced into Igo Coelho www.igocoelho.com.br
29. Atribuições >> valor = 1 => 1 >> valor += 1 => 2 >> valor -= 1 => 1 Igo Coelho www.igocoelho.com.br
30. Atribuições >> a = 2 => 2 >> b = 3 => 3 >> a, b = b, a => [3, 2] >> puts a 3 => nil >> puts b 2 => nil Igo Coelho www.igocoelho.com.br
31.
32.
33.
34.
35. false e true são as únicas instancias da FalseClass and TrueClass Igo Coelho www.igocoelho.com.br
36.
37.
38.
39. Definir uma classe e instanciar um objecto class Consultor def initialize(nome) # As váriaveis de instancia começam com @ @nome = nome end def diz_ola # Método de instancia puts "#{@nome} diz olá” end end igo = Consultor.new(“Igo”) igo.diz_ola Igo Coelho www.igocoelho.com.br
40. Herança de Classes # Programador é um Consultor e extende com carct. adicionais class Programador < Consultor def initialize(nome, ide_favorito) super(nome) @ide_favorito = ide_favorito end # redefinimos o método diz_ola no Consultor def diz_ola super puts "O IDE favorito é #{@ide_favorito}” end end hugo = Programador.new(“Hugo”, “TextMate”) hugo.diz_ola Igo Coelho www.igocoelho.com.br
41. Tipagem class PatoNormal def faz_quack “ Quack!” end end class PatoEstranho def faz_quack “ Queck!” end end Igo Coelho www.igocoelho.com.br
42. Tipagem class CriadorDePatos def castiga(pato) pato.faz_quack end end pato1 = PatoNormal.new pato2 = PatoEstranho.new c = CriadorDePatos.new puts c.castiga(pato1) puts c.castiga(pato2) Igo Coelho www.igocoelho.com.br
43. Métodos Getter e Setter class Consultor def initialize(nome) self.nome = nome end def nome @nome end def nome=(nome) @nome = nome end end consultor = Consultor.new("Pedro") puts consultor.nome consultor.nome = "David" Igo Coelho www.igocoelho.com.br
44. Getter e Setter... attr_accessor class Consultor attr_accessor :nome def initialize(nome) self.nome = nome end end consultor = Consultor.new("Paulo") puts consultor.nome consultor.nome = "David" puts consultor.nome Igo Coelho www.igocoelho.com.br
45. Comparação A comparação entre objetos é feita através do método == reescreva e diga como os objetos devem ser comparados class Aluno def ==(outro) self.cpf == outro.cpf end end Igo Coelho www.igocoelho.com.br
46.
47. Os métodos são identificados pelos seus nomes apenas, não existe overloading com assinaturas de argumentos
51. Os argumentos podem ter valores por defeito ex: def meu_metodo(a, b = ’senior’) Igo Coelho www.igocoelho.com.br
52. Metaprogramação class Aluno # não sabe nada End class Professor def ensina(aluno) def aluno.escreve “ Sei escrever” end end end Igo Coelho www.igocoelho.com.br
53. Metaprogramação juca = Aluno.new juca.respond_to? :escreve => false professor = Professor.new professor.ensina juca juca.escreve => Sei escrever Igo Coelho www.igocoelho.com.br
54. Array lista = Array.new lista << “primeiro” lista << “segundo” puts lista[1] => “segundo” lista = [1, 2, “string”, :simbolo] lista[2] => “string” Igo Coelho www.igocoelho.com.br
55. Hash mapa = Hash.new mapa[:item1] = “lala” mapa['item2'] = “lele” mapa[p] = “lulu” Por serem únicos e imutáveis, símbolos são as melhores opções para chaves em Hashes Igo Coelho www.igocoelho.com.br
56. Hash Uma técnica de programação muito conhecida é o uso de hashes como parâmetros únicos em métodos def transfere(argumentos) destino = argumentos [:destino] valor = argumentos [:valor] end transfere({:destino => outra_conta, :valor => 100.0}) transfere :destino => outra_conta, :valor => 100.0 Igo Coelho www.igocoelho.com.br
57. if, unless e o operador ? if count > 10 message = “Try again” else message = “Enter command” end raise “Unauthorized” if !current_user.admin? raise “Unauthorized” unless current_user.admin? status = input > 10 ? “Number too big” : “ok” Igo Coelho www.igocoelho.com.br
58. Iterators: while, until, and for while count < 100 puts count count += 1 end for user in @users if user.pago? puts user break end end until count > 5 puts count count += 1 end puts(count += 1) until count > 5 Igo Coelho www.igocoelho.com.br
59. case case x when 0 puts "Zero" when 1, 2..5 puts "Second branch" when 6..10 puts "Third branch" when x.downcase == “peter” puts “Seventh branch” else puts "Eight branch" end Igo Coelho www.igocoelho.com.br
63. Os asserts são utilizados para as verificaões Igo Coelho www.igocoelho.com.br
64. Testes require 'test/unit' class CalculadoraTest < Test::Unit::TestCase def setup @calc = Calculadora.new end def test_somar assert_equal 4, @calc.somar(2, 2) end end Igo Coelho www.igocoelho.com.br
65. Stubs class Clock def time Time.now end end class Event def initialize(start_time) @start_time = start_time end def started?(clock = Clock.new) clock.time > @start_time end end Igo Coelho www.igocoelho.com.br
66. Stubs class StubClock def time Time.parse('2007-07-09 19:00') end end clock = StubClock.new meeting = Event.new(Time.parse('2007-07-09 18:00')) pub = Event.new(Time.parse('2007-07-09 20:00')) assert_equal true, meeting.started?(clock) assert_equal false, pub.started?(clock) * Use require 'time' Igo Coelho www.igocoelho.com.br