Ruby’s Singleton Class
You can define methods for a single instance

a = Array.new
b = Array.new

def a.hello
  puts "Hello Devclub!"
end

a.hello
# => "Hello Devclub!"

b.hello
# => NoMethodError: undefined method 'hello' for []:Array
Or override a method on a single instance
class Dog
  def speak
    puts "bark"
  end
end

muki = Dog.new

def muki.speak
  puts "auh"
end

muki.speak
# => "auh"

puff = Dog.new

puff.speak
# => "bark"
Enters the Singleton class

                            class
                  puff                     Dog




          class               muki         super         super
muki                                               Dog
                         Singleton class




muki.singleton_methods
# => ["speak"]

puff.singleton_methods
# => []
class A

  def self.hello
    puts "Hello from class method!"
  end

end



A.hello
# => "Hello from class method!"

A.singleton_methods
# => ["hello"]
A.class
# => Class

A.superclass
# => Object


                      class
               A                     Class




                      super
               A                     Object




                   method dispatch

        A                 'A                  Object
a_meta = class << A; self; end;

puts a_meta
# => #<Class:A>

meta_instance = a_meta.new
# => TypeError: can't create instance of virtual
class
Everything in Ruby is an object

1.class
# => Fixnum

nil.class
# => NilClass

NilClass.class
# => Class

Class.class
# => Class




class A
  puts self.class
end

# => Class
Practical uses



class ApiClient
  attr_accessor :session

  def get_session
    # http request
  end

  def user
    session.user
  end
end
Practical uses

class ApiClientTest < Test::Unit::TestCase

  def setup
    @api_client = ApiClient.new

    def @api_client.get_session
      @api_client.session = Session.new(:user => "Mati")
    end
  end

  def test_user_mati
    @api_client.get_session
    assert(@api_client.user == 'Mati')
  end

  def test_user_nil
    assert(@api_client.user.nil?)
  end

end
Questions?
ESTYLE comp
                      LIF           an
                   AL                 y
                 IT
          G
       DI




                                          We are looking for
   the
CA N N E D




                                          Android Developers
     AP




             S
         P




                                          anton@cannedapps.com

Ruby singleton class

  • 1.
  • 2.
    You can definemethods for a single instance a = Array.new b = Array.new def a.hello puts "Hello Devclub!" end a.hello # => "Hello Devclub!" b.hello # => NoMethodError: undefined method 'hello' for []:Array
  • 3.
    Or override amethod on a single instance class Dog def speak puts "bark" end end muki = Dog.new def muki.speak puts "auh" end muki.speak # => "auh" puff = Dog.new puff.speak # => "bark"
  • 4.
    Enters the Singletonclass class puff Dog class muki super super muki Dog Singleton class muki.singleton_methods # => ["speak"] puff.singleton_methods # => []
  • 5.
    class A def self.hello puts "Hello from class method!" end end A.hello # => "Hello from class method!" A.singleton_methods # => ["hello"]
  • 6.
    A.class # => Class A.superclass #=> Object class A Class super A Object method dispatch A 'A Object
  • 7.
    a_meta = class<< A; self; end; puts a_meta # => #<Class:A> meta_instance = a_meta.new # => TypeError: can't create instance of virtual class
  • 8.
    Everything in Rubyis an object 1.class # => Fixnum nil.class # => NilClass NilClass.class # => Class Class.class # => Class class A puts self.class end # => Class
  • 9.
    Practical uses class ApiClient attr_accessor :session def get_session # http request end def user session.user end end
  • 10.
    Practical uses class ApiClientTest< Test::Unit::TestCase def setup @api_client = ApiClient.new def @api_client.get_session @api_client.session = Session.new(:user => "Mati") end end def test_user_mati @api_client.get_session assert(@api_client.user == 'Mati') end def test_user_nil assert(@api_client.user.nil?) end end
  • 11.
  • 12.
    ESTYLE comp LIF an AL y IT G DI We are looking for the CA N N E D Android Developers AP S P anton@cannedapps.com

Editor's Notes

  • #2 \n
  • #3 2 array instantsi, meetod &amp;#x201C;hello&amp;#x201D; defineeritakse ainult instants &amp;#x201C;a&amp;#x201D;-le\n
  • #4 Siin on j&amp;#xE4;llegi n&amp;#xE4;ha kuidas &amp;#x201C;muki&amp;#x201D; instantsil defineeritakse &amp;#xFC;le meetod &amp;#x201C;speak&amp;#x201D;\n\nStaatilistest keeltest tulenev l&amp;#xE4;henemine reeglina ette, et on olemas klassid milledel defineeritakse meetodid mida selle klassi objektid kasutada saavad.\n\nKuhu antud juhul &amp;#x201C;muki.speak&amp;#x201D; meetod defineeritakse?\n\nKui see definitsioon tehtaks &amp;#x201C;muki&amp;#x201D; klassile milleks on &amp;#x201C;Dog&amp;#x201D; siis peaks &amp;#x201C;speak&amp;#x201D; meetodi defineerimine laienema ka instantsile &amp;#x201C;puff&amp;#x201D;\n\n\n
  • #5 muki instantsile luuakse Singleton klass sellel hetkel kui Ruby interpreter n&amp;#xE4;eb vajadust instantsi spetsiifiliseks loogikaks\n
  • #6 Mis tegelikult juhtub klassi meetodi defineerimisel on see, et see meetod defineeritakse samuti klass A singleton klassi\n\nMiks see nii on?\n\n\n\n\n\n\n\n\n\n
  • #7 Singleton klassi omadused:\n\n1. N&amp;#xE4;htamatu p&amp;#xE4;rinevuse jadas\n2. Singleton klassi ei saa instantiate&amp;#x2019;ida\n\n\n\n\n\n
  • #8 Singleton klassi omadused:\n\n1. N&amp;#xE4;htamatu p&amp;#xE4;rinevuse jadas\n2. Singleton klassi ei saa instantiate&amp;#x2019;ida\n\nTODO: show inheritance chain\n\n\n\n
  • #9 1. Ruby&amp;#x2019;s on k&amp;#xF5;ik objekt\n\n2. Ruby vajab klassimeetodeid kuid toetab ainult instantsimeetodeid.\n\nA on klassi Class subklass. Objekt-orienteeritust silmas pidades peaks objekti A klassimeetod defineeritama tema superklassi. Seda ei saa aga defineerida klassi Class kuna sellisel juhul oleks antud meetod k&amp;#xF5;ikidele objektidele k&amp;#xE4;ttesaadav.\n\nSeega tulenevalt sellest kuidas Ruby method dispatch t&amp;#xF6;&amp;#xF6;tab luuakse objekti A p&amp;#xE4;rinevusejadasse &amp;#x2018;A kus defineeritakse tema klassimeetodid.\n
  • #10 K&amp;#xF5;ige lihtsam n&amp;#xE4;ide instantsi spetsiifilisest loogikast on Testides meetodite mock&amp;#x2019;imine\n\nLisaks:\nSingleton class on &amp;#xFC;heks talaks mis teeb Ruby&amp;#x2019;st high-level metaprogrammeerimise keele.\nMida see t&amp;#xE4;hendab on see, et see v&amp;#xF5;imaldab koodi kirjutada \nabstraktselt, domeenispetsiifiliselt, lihtsamalt, loogilisemalt\n\n\n\n\n\n
  • #11 K&amp;#xF5;ige lihtsam n&amp;#xE4;ide instantsi spetsiifilisest loogikast on Testides meetodite mock&amp;#x2019;imine\n\nLisaks:\nSingleton class on &amp;#xFC;heks talaks mis teeb Ruby&amp;#x2019;st high-level metaprogrammeerimise keele.\nMida see t&amp;#xE4;hendab on see, et see v&amp;#xF5;imaldab koodi kirjutada \nabstraktselt, domeenispetsiifiliselt, lihtsamalt, loogilisemalt\n\n\n\n\n\n\n\n\n\n\n
  • #12 K&amp;#xF5;ige lihtsam n&amp;#xE4;ide instantsi spetsiifilisest loogikast on Testides meetodite mock&amp;#x2019;imine\n\nLisaks:\nSingleton class on &amp;#xFC;heks talaks mis teeb Ruby&amp;#x2019;st high-level metaprogrammeerimise keele.\nMida see t&amp;#xE4;hendab on see, et see v&amp;#xF5;imaldab koodi kirjutada \nabstraktselt, domeenispetsiifiliselt, lihtsamalt, loogilisemalt\n\n\n\n\n\n\n\n\n\n\n
  • #13 \n