Slide 1

Slide 1 text

Bronie User Group Cologne hosted by 15.2.2012

Slide 2

Slide 2 text

Ruby #8 “self”

Slide 3

Slide 3 text

It’s all about (my) self!

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

self ändern self = Object.new SyntaxError: Can't change the value of self ;)

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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") => # is on a visit. => # is pleased about a visit.

Slide 8

Slide 8 text

class & module class Pony puts self def work puts self end end Pony.new.work => # => Pony

Slide 9

Slide 9 text

class_eval & instance_eval

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

class Pony; end Pony.class_eval do puts self def work puts "#{self} is working!" end end => Pony Pony.new.work => # is working!

Slide 12

Slide 12 text

class Pony private def age "Don't let anyone know!" end end twilight_sparkle = Pony.new puts twilight_sparkle => # twilight_sparkle.instance_eval do puts self puts age end => # => Don't let anyone know!

Slide 13

Slide 13 text

Fun fact #1 private Methoden sind nur mit implizitem Empfänger zulässig! NoMethodError: private method ‘age’ called for # 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!

Slide 14

Slide 14 text

It’s all about methods!

Slide 15

Slide 15 text

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!

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Benutzt du regelmäßig Singleton Methods?

Slide 18

Slide 18 text

Bestimmt!

Slide 19

Slide 19 text

Wetten? ;)

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Methoden in Ruby class Ranking def rank!; end def self.default_score; end end Methode für Instanzen Methode für self (also Ranking)

Slide 22

Slide 22 text

Ruby Object Model

Slide 23

Slide 23 text

Ruby Object Model User Object BasicObject superclass #

Slide 24

Slide 24 text

Ruby Object Model User Object BasicObject superclass Module Class #

Slide 25

Slide 25 text

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?!

Slide 26

Slide 26 text

Introducing Singleton Class

Slide 27

Slide 27 text

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!

Slide 28

Slide 28 text

Klassen, Singleton Classes, Objects....?! User # #> superclass class singleton class

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Methoden finden in Ruby User Object # #> # 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

Slide 31

Slide 31 text

Fun Fact #3 Ranking.singleton_class.class_eval {} == Ranking.instance_eval {}

Slide 32

Slide 32 text

self hängt vom Kontext ab Methoden leben in Modulen, Variablen in Objektinstanzen Alle(!) Objektinstanzen haben Singleton Classes

Slide 33

Slide 33 text

One More Thing …

Slide 34

Slide 34 text

Frage!!

Slide 35

Slide 35 text

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 #

Slide 36

Slide 36 text

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?

Slide 37

Slide 37 text

Thanks! Q & A? Dirk Breuer / @railsbros_dirk Sebastian Cohnen / @tisba ? “My Little Pony” © Hasbro Studios and DHX Media Vancouver rubyismagic.de