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.

8920246f63abbfdeb84bb1bfb2d2e4fd?s=128

Matheus Azzi

April 11, 2015
Tweet

Transcript

  1. Iniciando com Ruby A programmer's best friend Matheus Azzi

  2. Matheus Azzi www.matheusazzi.com matheusazzi fb.com/matheusazzi Codeminer 42 speakerdeck.com/matheusazzi matheus.azzi@codeminer42.com

  3. Ruby é uma linguagem: • Dinâmica • Multi-paradigma • Interpretada

    • Simples • Produtiva
  4. 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
  5. 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
  6. Quem usa?

  7. A queridinha das Startups

  8. 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
  9. IRB

  10. #include <stdio.h> int main() { printf("Hello World"); } Hello World

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

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

    void Main(string[] args) { Console.WriteLine("Hello World"); } } C#
  13. Hello World puts "Hello World" Ruby

  14. Hello World puts "Hello World" Ruby p "Hello World"

  15. Tipagem

  16. Tipagem Dinâmica Forte Duck typing: Se anda como um pato

    e faz barulho como um pato, então deve ser um pato.
  17. 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
  18. 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
  19. Hello World hello = "Hello World" puts hello # "Hello

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

    e não se usa chaves "{ }" para delimitar os métodos.
  21. 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();
  22. 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
  23. Parâmetros

  24. 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)
  25. 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)
  26. 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)
  27. Condicionais Ruby possui os mais diversos tipos e formas de

    controle de fluxo.
  28. 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
  29. 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
  30. 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?
  31. 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
  32. 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 }
  33. 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
  34. 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
  35. 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"
  36. 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
  37. 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
  38. 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
  39. Heranças

  40. 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
  41. class String def palindroma? word = self.downcase word == word.reverse

    end end Classes Abertas
  42. "Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?

    word = self.downcase word == word.reverse end end Classes Abertas
  43. "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
  44. "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
  45. "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
  46. "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
  47. "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
  48. "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
  49. Variáveis variavel = "Hello" # Local $variavel = "Hello" #

    Global @variavel = "Hello" # Atributo da classe @@variavel = "Hello" # Privada da classe VARIAVEL = "Hello" # Constante
  50. Classes class Person end

  51. def initialize(name) @name = name end p = Person.new "John"

    Classes class Person end
  52. 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
  53. 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
  54. Classes class Person def initialize(name) @name = name end end

  55. 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
  56. 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
  57. 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
  58. 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"
  59. 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"
  60. 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
  61. 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
  62. class Animal include Estomago extend Adotavel end module Estomago def

    digerir end end module Adotavel def adotar end end Módulos
  63. 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
  64. Gems bundle install # Gemfile source 'https://rubygems.org' ruby '2.2.1' gem

    'sinatra', '1.4.6' gem 'sass' gem 'rspec'
  65. Sinatra require 'sinatra' get '/' do 'Hello world!' end get

    '/:name' do |name| "Hello #{name}" end
  66. 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/