A ciência por trás
     do Ruby
               Carlos Brando
         www.nomedojogo.com
BETA

A ciência por trás
     do Ruby
               Carlos Brando
         www.nomedojogo.com
BEGIN
  WHILE 1=1 DO
    BEGIN
      outtext("Hello World!");
      outimage;
    END;
END;
Simula
template<typename _Tp, typename _Sequence = deque<_Tp> >
    class stack
    {
      // concept requirements
      typedef typename _Sequence::value_type _Sequence_value_type;
      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
      __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
      __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

    }
template<typename _Tp, typename _Sequence = deque<_Tp> >
    class stack
    {
      // concept requirements
      typedef typename _Sequence::value_type _Sequence_value_type;
      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
      __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept)
      __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept)

    }




   final class Pair<A extends Comparable<A> & Cloneable<A>,
                    B extends Comparable<B> & Cloneable<B>>
      implements Comparable<Pair<A,B>>, Cloneable<Pair<A,B>> {



   }
http://blog.caelum.com.br/2006/10/14/como-nao-aprender-orientacao-a-objetos-heranca/
Ruby
 é uma linguagem
orientada a objetos
Ruby
 é uma verdadeira
     linguagem
orientada a objetos
Objetos
Estado + Comportamento
class Dog
  def initialize(breed, name)
    @breed = breed
    @name = name
  end

  def eat
    # ...
  end

  def sleep
    # ...
  end
end
rex = Dog.new("bulldog", "Rex")
rex = Dog.new("bulldog", "Rex")



      rex
@breed: “bulldog”
@name: “Rex”

sleep()
eat()
rex = Dog.new("bulldog", "Rex")



                                   Dog
     rex
@breed                     sleep
@name
                           eat
tabela de métodos
rex = Dog.new("bulldog", "Rex")



                                   Dog
        rex
@breed                     sleep
@name
                           eat
class
fido = Dog.new("vira-lata", "Fido")

        fido
@breed                              Dog
@name
class                       sleep
                            eat

        rex
@breed
@name
class
self
self
      É o centro do seu código Ruby


• Onde as variáveis de instância são encontradas
Ex: @var

• O receiver padrão para as chamadas de métodos
Ex: eat(‘hot dog’)
self
Apenas duas coisas podem mudar self


• Uma chamada de método
• A definição de uma classe/módulo
dog = "rex"

puts dog.upcase

puts dog.object_id

def dog.speak
  "Auau"
end

puts dog.speak
self           String
dog   @value: “rex”   downcase
                      upcase
      class
Object
                      dup
                      object_id

                      parent




          self            String
dog   @value: “rex”   downcase
                      upcase
      class
                      parent
Object
                      dup
                      object_id

                      parent

                          String
                      downcase
                      upcase

                      parent
          self
                           ????
dog   @value: “rex”
                      speak
      class

                      parent
Object
     Singleton Class
                                  dup
                                  object_id
• Eigenclass, Metaclass,
Ghost Class, Virtual Class, ...   parent


• Uma classe comum, mas               String
escondida                         downcase
                                  upcase
• Apenas uma por objeto
                                  parent
                    self
                                       ????
  dog           @value: “rex”
                                  speak
                class

                                  parent
self
Apenas duas coisas podem mudar self


  Uma chamada de método

• A definição de uma classe/módulo
# código

class Dog

  # código

end

# código
class Dog

  def speak
   “Miau”
  end

  def self.speak
    "Auau"
  end

end
Object
                     dup
                     object_id

                     parent




          self          Dog
                     parent
dog   @name: “rex”   metodos

      class
Object      Object
                     dup         dup
                     object_id   object_id

                     parent      parent




          self          Dog         Class
                     parent      parent
dog   @name: “rex”   metodos

      class
                     class       class
Object

                       Object
                      dup           Class
                      object_id   parent

                      parent
                                  class


          self           Dog         ????
                      parent      parent
dog   @value: “rex”   metodos
                                  speak
      class
                      class
Tudo que você precisa se
      lembrar é...


 Variáveis de instância: localizadas na variável self

 Métodos: localizados na classe da variável self
Mas ainda não
terminamos...
class Dog

  class << self
    def speak
    end
  end

end
public class Cachorro {
  private static int patas = "";

    public static int getPatas() {
      return patas;
    }
}
class Cachorro
  @patas = 4

  def getPatas
    @patas
  end
end
Mas ainda não
terminamos...
class B < A

end
Só mais uma coisa
   importante...
include
   vs
extend
Object
dup
object_id

parent




 Minha Classe
parent
downcase
upcase
Object
dup
object_id



   ????         MeuMódulo
parent
                metodo
   tabela de
   métodos


  MinhaClasse
parent
meu_metodo
Tudo isso fez sentido
    para você?
@carlosbrando

A ciência por trás do Ruby

  • 1.
    A ciência portrás do Ruby Carlos Brando www.nomedojogo.com
  • 2.
    BETA A ciência portrás do Ruby Carlos Brando www.nomedojogo.com
  • 10.
    BEGIN WHILE1=1 DO BEGIN outtext("Hello World!"); outimage; END; END;
  • 11.
  • 15.
    template<typename _Tp, typename_Sequence = deque<_Tp> > class stack { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) }
  • 16.
    template<typename _Tp, typename_Sequence = deque<_Tp> > class stack { // concept requirements typedef typename _Sequence::value_type _Sequence_value_type; __glibcxx_class_requires(_Tp, _SGIAssignableConcept) __glibcxx_class_requires(_Sequence, _BackInsertionSequenceConcept) __glibcxx_class_requires2(_Tp, _Sequence_value_type, _SameTypeConcept) } final class Pair<A extends Comparable<A> & Cloneable<A>, B extends Comparable<B> & Cloneable<B>> implements Comparable<Pair<A,B>>, Cloneable<Pair<A,B>> { }
  • 17.
  • 18.
    Ruby é umalinguagem orientada a objetos
  • 19.
    Ruby é umaverdadeira linguagem orientada a objetos
  • 20.
  • 22.
    class Dog def initialize(breed, name) @breed = breed @name = name end def eat # ... end def sleep # ... end end
  • 23.
  • 24.
    rex = Dog.new("bulldog","Rex") rex @breed: “bulldog” @name: “Rex” sleep() eat()
  • 25.
    rex = Dog.new("bulldog","Rex") Dog rex @breed sleep @name eat tabela de métodos
  • 26.
    rex = Dog.new("bulldog","Rex") Dog rex @breed sleep @name eat class
  • 27.
    fido = Dog.new("vira-lata","Fido") fido @breed Dog @name class sleep eat rex @breed @name class
  • 28.
  • 29.
    self É o centro do seu código Ruby • Onde as variáveis de instância são encontradas Ex: @var • O receiver padrão para as chamadas de métodos Ex: eat(‘hot dog’)
  • 30.
    self Apenas duas coisaspodem mudar self • Uma chamada de método • A definição de uma classe/módulo
  • 31.
    dog = "rex" putsdog.upcase puts dog.object_id def dog.speak "Auau" end puts dog.speak
  • 32.
    self String dog @value: “rex” downcase upcase class
  • 33.
    Object dup object_id parent self String dog @value: “rex” downcase upcase class parent
  • 34.
    Object dup object_id parent String downcase upcase parent self ???? dog @value: “rex” speak class parent
  • 35.
    Object Singleton Class dup object_id • Eigenclass, Metaclass, Ghost Class, Virtual Class, ... parent • Uma classe comum, mas String escondida downcase upcase • Apenas uma por objeto parent self ???? dog @value: “rex” speak class parent
  • 36.
    self Apenas duas coisaspodem mudar self Uma chamada de método • A definição de uma classe/módulo
  • 37.
    # código class Dog # código end # código
  • 38.
    class Dog def speak “Miau” end def self.speak "Auau" end end
  • 39.
    Object dup object_id parent self Dog parent dog @name: “rex” metodos class
  • 40.
    Object Object dup dup object_id object_id parent parent self Dog Class parent parent dog @name: “rex” metodos class class class
  • 41.
    Object Object dup Class object_id parent parent class self Dog ???? parent parent dog @value: “rex” metodos speak class class
  • 42.
    Tudo que vocêprecisa se lembrar é... Variáveis de instância: localizadas na variável self Métodos: localizados na classe da variável self
  • 43.
  • 44.
    class Dog class << self def speak end end end
  • 45.
    public class Cachorro{ private static int patas = ""; public static int getPatas() { return patas; } }
  • 46.
    class Cachorro @patas = 4 def getPatas @patas end end
  • 47.
  • 48.
    class B <A end
  • 49.
    Só mais umacoisa importante...
  • 50.
    include vs extend
  • 51.
  • 52.
    Object dup object_id ???? MeuMódulo parent metodo tabela de métodos MinhaClasse parent meu_metodo
  • 53.
    Tudo isso fezsentido para você?
  • 55.