Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby is Magic: self

Ruby is Magic: self

This time we talk about self, not ourselves but self in Ruby. It is brief overview of Ruby's object model and what you can do with it. As usual @tisba and me presented this talk at the Cologne Ruby user group and the slides are in German.

Copyright Notice: My Little Pony - Friendship is Magic is Property of Hasbro and The Hub.

Dirk Breuer

February 15, 2012
Tweet

More Decks by Dirk Breuer

Other Decks in Programming

Transcript

  1. self ist ein Schlüsselwort self zeigt immer auf das “aktuelle”

    Objekt self ist abhängig vom Kontext self ist der Default-Empfänger von Nachrichten self
  2. self ändern self ändert sich immer dann, wenn der Kontext

    sich ändert Und das passiert z.B. bei einem Methodenaufruf einer Klassen oder Modul-Definition bei der Verwendung von instance_eval, class_eval & co
  3. class Pony def visit(other_pony) puts "#{self} is on a visit."

    other_pony.is_pleased end def is_pleased puts "#{self} is pleased about a visit." end end Pony.new("Applejack").visit Pony.new("Pinkie Pie") => #<Pony:Applejack> is on a visit. => #<Pony:Pinkie Pie> is pleased about a visit.
  4. class & module class Pony puts self def work puts

    self end end Pony.new.work => #<Pony:0x106da8368> => Pony
  5. class_eval & instance_eval es gibt instance_eval und class_eval / module_eval

    instance_eval instance_eval lässt sich durch class_eval äquivalent verwenden class_eval / module_eval führt Code (String oder Block) im Kontext des Empfängers aus self wird innerhalb des Blocks auf den Empfänger geändert
  6. class Pony; end Pony.class_eval do puts self def work puts

    "#{self} is working!" end end => Pony Pony.new.work => #<Pony:0x10bc98a68> is working!
  7. class Pony private def age "Don't let anyone know!" end

    end twilight_sparkle = Pony.new puts twilight_sparkle => #<Pony:0x10ba7b690> twilight_sparkle.instance_eval do puts self puts age end => #<Pony:0x10ba7b690> => Don't let anyone know!
  8. Fun fact #1 private Methoden sind nur mit implizitem Empfänger

    zulässig! NoMethodError: private method ‘age’ called for #<Pony:0x00…d8> class Pony def want_to_know_age! self.age end private def age "Don't let anyone know!" end end Pony.new.want_to_know_age!
  9. class Ranking def initialize(items) @items = items end def rank!

    @items.each do |item| # ... perform a secret ranking here end end def size @item.size end def each(&block) @item.each(&block) end end ranking = Ranking.new([1,2,3,4]) ranking.rank!
  10. Singleton Methods ranking = [1,2,3,4] def ranking.rank! self.each do |item|

    # perform ranking end end ranking.rank! Singleton Methods sind Methoden, die nur auf einer Objektinstanz definiert sind Andere Instanzen der gleichen Klasse, besitzen diese Methode nicht Sie erweitern also eine spezifische Objektinstanz
  11. Klassen sind Objekte, von der Klasse Class Daher besitzen sie

    ebenfalls Singleton Methods Man vergleiche... class Ranking def self.default_score 23 end end def ranking.rank!; … end def Ranking.default_score Class Methods sind Singleton Methods! Fun fact #2
  12. Methoden in Ruby class Ranking def rank!; end def self.default_score;

    end end Methode für Instanzen Methode für self (also Ranking)
  13. Was hast das mit self zu tun? Oder mit Methoden?

    pinkie_pie = Pony.new def pinkie_pie.partey puts "PARTEY!!" end puts Pony.instance_methods.include? :partey # => false puts pinkie_pie.methods.include? :partey # => true Woher kommt #partey?!
  14. Singleton Class Jedes Objekt hat seine eigene Meta Klasse, oder

    auch Singleton Class Instanz-Variablen (Zustand) lebt in Objekten/Instanzen Methoden (Verhalten) leben in Klassen/Modulen Daher muss es für jedes Objekt eine eigene Klasse geben!
  15. Singleton Class explizit machen singleton_klass = (class << Ranking; self;

    end) singleton_klass = Ranking.singleton_class # 1.9 class Ranking class << self def singleton_class return self end end end
  16. Methoden finden in Ruby User Object #<User> #<Class:#<User>> #<Class:User> Singleton

    Class von hubert Singleton Class von der User Klasse class User def self.default_location "Earth" end end hubert = User.new def hubert.resarch # researching ... end
  17. self hängt vom Kontext ab Methoden leben in Modulen, Variablen

    in Objektinstanzen Alle(!) Objektinstanzen haben Singleton Classes
  18. Was passiert hier?! class MyClass def outer_method puts "outer" def

    inner_method puts "inner" end end end MyClass.new.inner_method NoMethodError: undefined method `inner_method' for #<Bar:0x00…68>
  19. Was passiert hier?! class MyClass def outer_method puts "outer" def

    inner_method puts "inner" end end end obj = MyClass.new obj.outer_method # => outer obj.inner_method # => inner Hint: Was ist self?
  20. Thanks! Q & A? Dirk Breuer / @railsbros_dirk Sebastian Cohnen

    / @tisba ? “My Little Pony” © Hasbro Studios and DHX Media Vancouver rubyismagic.de