Slide 1

Slide 1 text

Iniciando com Ruby A programmer's best friend Matheus Azzi

Slide 2

Slide 2 text

Matheus Azzi www.matheusazzi.com matheusazzi fb.com/matheusazzi Codeminer 42 speakerdeck.com/matheusazzi [email protected]

Slide 3

Slide 3 text

Ruby é uma linguagem: • Dinâmica • Multi-paradigma • Interpretada • Simples • Produtiva

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Quem usa?

Slide 7

Slide 7 text

A queridinha das Startups

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

IRB

Slide 10

Slide 10 text

#include int main() { printf("Hello World"); } Hello World C

Slide 11

Slide 11 text

Hello World public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } Java

Slide 12

Slide 12 text

Hello World using System; public class HelloWorld { public static void Main(string[] args) { Console.WriteLine("Hello World"); } } C#

Slide 13

Slide 13 text

Hello World puts "Hello World" Ruby

Slide 14

Slide 14 text

Hello World puts "Hello World" Ruby p "Hello World"

Slide 15

Slide 15 text

Tipagem

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Hello World hello = "Hello World" puts hello # "Hello World" puts hello.upcase # "HELLO WORLD" puts hello.reverse # "dlroW olleH"

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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();

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Parâmetros

Slide 24

Slide 24 text

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)

Slide 25

Slide 25 text

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)

Slide 26

Slide 26 text

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)

Slide 27

Slide 27 text

Condicionais Ruby possui os mais diversos tipos e formas de controle de fluxo.

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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?

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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 }

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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"

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

Heranças

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

class String def palindroma? word = self.downcase word == word.reverse end end Classes Abertas

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

"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

Slide 44

Slide 44 text

"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

Slide 45

Slide 45 text

"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

Slide 46

Slide 46 text

"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

Slide 47

Slide 47 text

"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

Slide 48

Slide 48 text

"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

Slide 49

Slide 49 text

Variáveis variavel = "Hello" # Local $variavel = "Hello" # Global @variavel = "Hello" # Atributo da classe @@variavel = "Hello" # Privada da classe VARIAVEL = "Hello" # Constante

Slide 50

Slide 50 text

Classes class Person end

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Classes class Person def initialize(name) @name = name end end

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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"

Slide 59

Slide 59 text

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"

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

Gems bundle install # Gemfile source 'https://rubygems.org' ruby '2.2.1' gem 'sinatra', '1.4.6' gem 'sass' gem 'rspec'

Slide 65

Slide 65 text

Sinatra require 'sinatra' get '/' do 'Hello world!' end get '/:name' do |name| "Hello #{name}" end

Slide 66

Slide 66 text

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/