Share
Embed
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
Transcript
66 slides
-
Ruby é uma linguagem: • Dinâmica • Multi-paradigma • Interpretada
• Simples • Produtiva -
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 -
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 -
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 -
Hello World public class HelloWorld { public static void main(String[]
args) { System.out.println("Hello World"); } } Java -
Hello World using System; public class HelloWorld { public static
void Main(string[] args) { Console.WriteLine("Hello World"); } } C# -
Tipagem Dinâmica Forte Duck typing: Se anda como um pato
e faz barulho como um pato, então deve ser um pato. -
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 -
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 -
Hello World hello = "Hello World" puts hello # "Hello
World" puts hello.upcase # "HELLO WORLD" puts hello.reverse # "dlroW olleH" -
Sintaxe No Ruby parênteses "( )" e ";" são opcionais
e não se usa chaves "{ }" para delimitar os métodos. -
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(); -
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 -
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) -
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) -
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) -
Condicionais Ruby possui os mais diversos tipos e formas de
controle de fluxo. -
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 -
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 -
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? -
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 -
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 } -
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. 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 -
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" -
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 -
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 -
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 -
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 -
class String def palindroma? word = self.downcase word == word.reverse
end end Classes Abertas -
"Bob".palindroma? # true "Bobby".palindroma? # false class String def palindroma?
word = self.downcase word == word.reverse end end Classes Abertas -
"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 -
"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 -
"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 -
"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 -
"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 -
"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 -
Variáveis variavel = "Hello" # Local $variavel = "Hello" #
Global @variavel = "Hello" # Atributo da classe @@variavel = "Hello" # Privada da classe VARIAVEL = "Hello" # Constante -
def initialize(name) @name = name end p = Person.new "John"
Classes class Person end -
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 -
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 -
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 -
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 -
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 -
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" -
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" -
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 -
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 -
class Animal include Estomago extend Adotavel end module Estomago def
digerir end end module Adotavel def adotar end end Módulos -
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 -
Gems bundle install # Gemfile source 'https://rubygems.org' ruby '2.2.1' gem
'sinatra', '1.4.6' gem 'sass' gem 'rspec' -
Sinatra require 'sinatra' get '/' do 'Hello world!' end get
'/:name' do |name| "Hello #{name}" end -
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/