Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Iniciando com Ruby

Iniciando com Ruby

Breve introdução a linguagem Ruby abordando as diferenças em relação a outras linguagens e o que faz o Ruby ser tão simples e produtivo.

Matheus Azzi

April 11, 2015
Tweet

More Decks by Matheus Azzi

Other Decks in Programming

Transcript

  1. História • Criada em 1995 por Yukihiro "Matz" Matsumoto •

    Influenciada por Perl, Lisp, Smalltalk e Python • Open Source - [http://github.com/ruby/ruby] • Stable Version - 2.2.1
  2. História Eu conhecia Perl e Python mas não me pareciam

    ter uma Orientação a Objeto genuína, eu procurei linguagens com esse intuito no mercado e não encontrei nenhuma. Eu queria minimizar minha frustração enquanto programava. A programming language for human beings - Matz
  3. Instalando sudo apt-get update OS X Ubuntu sudo apt-get install

    curl curl -sSL https://get.rvm.io | bash -s stable --ruby source ~/.rvm/scripts/rvm curl -sSL https://get.rvm.io | bash -s stable --ruby Windows http://www.rubyinstaller.org/ Ruby Version Manager ruby -v rvm list known rvm install 2.1 rvm install 2.2.1 rvm use 2.2.1 http://rvm.io
  4. IRB

  5. Hello World public class HelloWorld { public static void main(String[]

    args) { System.out.println("Hello World"); } } Java
  6. Hello World using System; public class HelloWorld { public static

    void Main(string[] args) { Console.WriteLine("Hello World"); } } C#
  7. Tipagem Dinâmica Forte Duck typing: Se anda como um pato

    e faz barulho como um pato, então deve ser um pato.
  8. Tipagem Dinâmica Forte Duck typing: Se anda como um pato

    e faz barulho como um pato, então deve ser um pato. hello = "Feevale" hello.classname # String hello = 10 hello.classname # Fixnum
  9. Tipagem Dinâmica Forte Duck typing: Se anda como um pato

    e faz barulho como um pato, então deve ser um pato. "Hello" + 42 // Hello42 10 + true // 11 "10" + 2.5 // "102.5" "Hello" + 42 # TypeError: no implicit conversion of Fixnum into String 10 + true # TypeError: true can't be coerced into Fixnum "10" + 2.5 # TypeError: no implicit conversion of Float into String Ruby Javascript
  10. Hello World hello = "Hello World" puts hello # "Hello

    World" puts hello.upcase # "HELLO WORLD" puts hello.reverse # "dlroW olleH"
  11. Sintaxe No Ruby parênteses "( )" e ";" são opcionais

    e não se usa chaves "{ }" para delimitar os métodos.
  12. Sintaxe No Ruby parênteses "( )" e ";" são opcionais

    e não se usa chaves "{ }" para delimitar os métodos. def say_hello(nome) puts("Olá #{nome}"); end say_hello("Matheus"); def feevale() puts("Olá Feevale"); end feevale();
  13. Sintaxe No Ruby parênteses "( )" e ";" são opcionais

    e não se usa chaves "{ }" para delimitar os métodos. def say_hello(nome) puts("Olá #{nome}"); end say_hello("Matheus"); def feevale() puts("Olá Feevale"); end feevale(); def say_hello nome puts "Olá #{nome}" end say_hello "Matheus" def feevale puts "Olá Feevale" end feevale
  14. Parâmetros def user(name, age, country) { name: name, age: age,

    country: country } end Parameters user("John Doe", 20, "Brasil") user("John Doe", nil, nil)
  15. Parâmetros Default Parameters def user(name, age = nil, country =

    nil) { name: name, age: age, country: country } end user "John Doe" user("John Doe", nil, "Brasil") def user(name, age, country) { name: name, age: age, country: country } end Parameters user("John Doe", 20, "Brasil") user("John Doe", nil, nil)
  16. Parâmetros Hash Parameters def user(name, options = {}) { name:

    name, age: options[:age], country: options[:country] } end user("John Doe", age: 20, country: "Brasil" state: "RS" city: "Novo Hamburgo" ) Default Parameters def user(name, age = nil, country = nil) { name: name, age: age, country: country } end user "John Doe" user("John Doe", nil, "Brasil") def user(name, age, country) { name: name, age: age, country: country } end Parameters user("John Doe", 20, "Brasil") user("John Doe", nil, nil)
  17. Condicionais Ruby possui os mais diversos tipos e formas de

    controle de fluxo. sign_in(user) if user.valid? if user.valid? sign_in user end if condicao faca_algo end faca_algo if condicao
  18. Condicionais Ruby possui os mais diversos tipos e formas de

    controle de fluxo. if condicao faz_algo elsif outra_condicao outra_acao else chuta_o_balde end sign_in(user) if user.valid? if user.valid? sign_in user end if condicao faca_algo end faca_algo if condicao
  19. Condicionais Ruby possui os mais diversos tipos e formas de

    controle de fluxo. if condicao faz_algo elsif outra_condicao outra_acao else chuta_o_balde end sign_in(user) if user.valid? if user.valid? sign_in user end if condicao faca_algo end faca_algo if condicao unless condicao executa_algo end executa_algo unless condicao unless user.logged? redirect end redirect unless user.logged?
  20. Condicionais idade = 20 case when idade <= 13 puts

    "Criança" when idade > 13 && idade <= 25 puts "Jovem" when idade > 25 && idade <= 55 puts "Adulto" else puts "Idoso" end idade = 20 case idade when 0..13 puts "Criança" when 14..25 puts "Jovem" when 26..55 puts "Adulto" else puts "Idoso" end
  21. Loops while i <= 10 do puts i i +=

    1 end # Ou puts i += 1 while i <= 10 until i > 10 do puts i i += 1 end # Ou puts i += 1 until i > 10 [0,1,2,3].each do |i| puts i end # Ou [0,1,2,3].each { |i| puts i } 3.times do puts "Hello" end # Ou 10.times { |i| puts i }
  22. Em Ruby, mesmo que você não defina um ele sempre

    vai retornar o último item do bloco. Na verdade só será feito algo diferente disso caso você defina um return. Retorno Implícito return
  23. Em Ruby, mesmo que você não defina um ele sempre

    vai retornar o último item do bloco. Na verdade só será feito algo diferente disso caso você defina um return. Retorno Implícito return Em Ruby, mesmo que você não defina um ele sempre vai retornar o último item do bloco. Na verdade só será feito algo diferente disso caso você defina um return. def retorno return "Ruby" end puts retorno def retorno "Ruby" end puts retorno def multiplicar(height, width) return height * width end puts multiplicar(3, 4) def multiplicar(height, width) height * width end puts multiplicar(3, 4) def aluno(user) if aluno.matriculado? return user.name end end def aluno(user) user.name if aluno.matriculado? end
  24. Em Ruby, mesmo que você não defina um ele sempre

    vai retornar o último item do bloco. Na verdade só será feito algo diferente disso caso você defina um return. Retorno Implícito return def numeros(a, b, c) soma = a + b + c if soma > 10 "#{soma} é MAIOR que 10" else "#{soma} é MENOR que 10" end end puts numeros(1, 2, 3) # 6 é MENOR que 10 puts numeros(5, 4, 8) # 17 é MAIOR que 10 idade = 30 puts estagio = case idade when 0..13 then "Criança" when 14..25 then "Jovem" when 26..55 then "Adulto" else "Idoso" end # "Adulto"
  25. Object-oriented Em Ruby, realmente tudo é um objeto Em muitas

    linguagens, um número é apenas um tipo primitivo. No Ruby ele é uma instância da classe Fixnum e possui seus próprios métodos como o laço de repetição que vimos antes, 3.times
  26. Object-oriented Em Ruby, realmente quase tudo é um objeto Em

    muitas linguagens, um número é apenas um tipo primitivo. No Ruby ele é uma instância da classe Fixnum e possui seus próprios métodos como o laço de repetição que vimos antes, 3.times 5.class # Fixnum 5.5.class # Float 5555555555.class # Bignum "Feevale".class # String [].class # Array {}.class # Hash (1..10).class # Range nil.class # NilClass false.class # FalseClass true.class # TrueClass :feevale.class # Symbol Class.class # Class Module.class # Class
  27. Heranças Em Ruby, realmente quase tudo é um objeto Em

    muitas linguagens, um número é apenas um tipo primitivo. No Ruby ele é uma instância da classe Fixnum e possui seus próprios métodos como o laço de repetição que vimos antes, 3.times "Matheus".class # String "Matheus".class.superclass # Object "Matheus".class.superclass.superclass # BasicObject [].class # Array [].class.superclass # Object [].class.superclass.superclass # BasicObject 5.class # Fixnum 5.class.superclass # Integer 5.class.superclass.superclass # Numeric 5.class.superclass.superclass.superclass # Object 5.class.superclass.superclass.superclass.superclass # BasicObject
  28. 3.odd? # true 3.even? # false 3.next # 4 100.reverse

    # NoMethodError: undefined method reverse' for 100:Fixnum 100.to_s.reverse # "001" [5.2, 10, 3, 6].max # 10 [5.2, 10, 3, 6].min # 3 [4, 2, 1, 4, 2, 2].uniq # [4, 2, 1] "Feevale".empty? # false "".empty? # true (1..5).to_a # [1, 2, 3, 4, 5] "Feevale".include? "eev" # true "Feevale".upcase # FEEVALE Object-oriented
  29. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end Classes Abertas
  30. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end class String def gauches "Bah, #{self} tchê" end end Classes Abertas
  31. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end "Vou executar esse método".gauches # Bah, Vou executar esse método tchê class String def gauches "Bah, #{self} tchê" end end Classes Abertas
  32. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end class Fixnum def dobra self * 2 end end "Vou executar esse método".gauches # Bah, Vou executar esse método tchê class String def gauches "Bah, #{self} tchê" end end Classes Abertas
  33. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end 5.dobra # 10 class Fixnum def dobra self * 2 end end "Vou executar esse método".gauches # Bah, Vou executar esse método tchê class String def gauches "Bah, #{self} tchê" end end Classes Abertas
  34. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end 5.dobra # 10 class Fixnum def dobra self * 2 end end "Vou executar esse método".gauches # Bah, Vou executar esse método tchê class String def gauches "Bah, #{self} tchê" end end class Time def weekend? self.saturday? || self.sunday? end end Classes Abertas
  35. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end 5.dobra # 10 class Fixnum def dobra self * 2 end end "Vou executar esse método".gauches # Bah, Vou executar esse método tchê class String def gauches "Bah, #{self} tchê" end end class Time def weekend? self.saturday? || self.sunday? end end Classes Abertas Time.now.weekend? # true
  36. Variáveis variavel = "Hello" # Local $variavel = "Hello" #

    Global @variavel = "Hello" # Atributo da classe @@variavel = "Hello" # Privada da classe VARIAVEL = "Hello" # Constante
  37. p.get_name # John p.set_name "Maria" p.get_name # Maria def get_name

    @name end def set_name(name) @name = name end def initialize(name) @name = name end p = Person.new "John" Classes class Person end
  38. p.get_name # John p.set_name "Maria" p.get_name # Maria def get_name

    @name end def set_name(name) @name = name end def initialize(name) @name = name end p = Person.new "John" Classes class Person end X
  39. Classes class Person attr_accessor :name def initialize(name) @name = name

    end end p = Person.new "John" p.name # John p.name = "Maria" p.name # Maria
  40. Classes class Person attr_accessor :name def initialize(name) @name = name

    end end p = Person.new "John" p.name # John p.name = "Maria" p.name # Maria
  41. Classes attr_reader :name # Cria só o método Get attr_writer

    :name # Cria só o método Set attr_accessor :name # Cria os métodos Get e Set
  42. attr_reader :name # Cria só o método Get attr_writer :name

    # Cria só o método Set attr_accessor :name # Cria os métodos Get e Set Classes class Person attr_reader :name, :gender attr_writer :age attr_accessor :country def initialize(name, gender, age, country) @name = name @gender = gender @age = age @country = country end end p = Person.new "John", :male, 18, "Brasil"
  43. attr_reader :name # Cria só o método Get attr_writer :name

    # Cria só o método Set attr_accessor :name # Cria os métodos Get e Set Classes p.name # "John" p.gender # :male p.name = "George" # NoMethodError p.gender = :female # NoMethodError p.country # "Brasil" p.country = "Uruguai" p.country # "Uruguai" p.age # NoMethodError p.age = 19 class Person attr_reader :name, :gender attr_writer :age attr_accessor :country def initialize(name, gender, age, country) @name = name @gender = gender @age = age @country = country end end p = Person.new "John", :male, 18, "Brasil"
  44. attr_reader :name # Cria só o método Get attr_writer :name

    # Cria só o método Set attr_accessor :name # Cria os métodos Get e Set Classes class MyClass def one "One" end def self.two "Two" end protected def three "Three" end private def four "Four" end end Método público Método de Classe Método protegido Método privado
  45. Heranças class Mamifero < Animal def correr end end class

    Ave < Animal def voar end end class Animal attr_accessor :nome, :idade def initialize(nome, idade) @nome = nome @idade = idade end def comer end end
  46. class Animal include Estomago extend Adotavel end module Estomago def

    digerir end end module Adotavel def adotar end end Módulos
  47. class Animal include Estomago extend Adotavel end module Estomago def

    digerir end end module Adotavel def adotar end end Módulos animal.digerir Animal.adotar Include: Expõe como métodos de instância Extend: Expõe como métodos de classe tigre.digerir Mamifero.adotar
  48. Sinatra require 'sinatra' get '/' do 'Hello world!' end get

    '/:name' do |name| "Hello #{name}" end
  49. Indo Além ~ http://www.tryruby.org/ ~ http://www.rubyconf.com.br/ ~ http://www.codecademy.com/tracks/ruby ~ http://www.gururs.com/events

    ~ http://www.rupy.com.br/ ~ http://www.tropicalrb.com/ ~ http://www.codeschool.com/paths/ruby ~ http://www.howtocode.com.br/ ~ http://www.casadocodigo.com.br/ ~ http://www.thedevelopersconference.com.br/