Ruby is Magic - Episode #8: self
Upcoming SlideShare
Loading in...5
×
 

Ruby is Magic - Episode #8: self

on

  • 700 views

In dieser Ausgabe von ’Ruby is Magic’ stellen wir euch das Schlüsselwort 'self' vor und damit verbunden gibt es auch eine Einführung in das Ruby Objektmodell.

In dieser Ausgabe von ’Ruby is Magic’ stellen wir euch das Schlüsselwort 'self' vor und damit verbunden gibt es auch eine Einführung in das Ruby Objektmodell.

Statistics

Views

Total Views
700
Views on SlideShare
652
Embed Views
48

Actions

Likes
0
Downloads
2
Comments
0

1 Embed 48

http://localhost 48

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Ruby is Magic - Episode #8: self Ruby is Magic - Episode #8: self Presentation Transcript

  • #8 “self ” RubyMontag, 20. Februar 12
  • It’s all about (my) self!Montag, 20. Februar 12
  • self 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 NachrichtenMontag, 20. Februar 12
  • self ändern self = Object.newMontag, 20. Februar 12
  • self ändern self = Object.new ;) SyntaxError: Cant change the value of selfMontag, 20. Februar 12
  • 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 & coMontag, 20. Februar 12
  • 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.Montag, 20. Februar 12
  • class & module class Pony puts self def work puts self end end => Pony Pony.new.work => #<Pony:0x106da8368>Montag, 20. Februar 12
  • class_eval & instance_evalMontag, 20. Februar 12
  • 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ändertMontag, 20. Februar 12
  • 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!Montag, 20. Februar 12
  • class Pony private def age "Dont 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> => Dont let anyone know!Montag, 20. Februar 12
  • Fun fact #1 private Methoden sind nur mit implizitem Empfänger zulässig! class Pony def want_to_know_age! self.age end Pony.new.want_to_know_age! private def age NoMethodError: private method ‘age’ "Dont let anyone know!" called for #<Pony:0x00…d8> end endMontag, 20. Februar 12
  • It’s all about methods!Montag, 20. Februar 12
  • 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 ranking = Ranking.new([1,2,3,4]) def each(&block) ranking.rank! @item.each(&block) end endMontag, 20. Februar 12
  • Singleton Methods ranking = [1,2,3,4] Singleton Methods sind Methoden, die nur auf einer Objektinstanz def ranking.rank! definiert sind self.each do |item| # perform ranking Andere Instanzen der gleichen end Klasse, besitzen diese Methode nicht end Sie erweitern also eine spezifische ranking.rank! ObjektinstanzMontag, 20. Februar 12
  • Benutzt du regelmäßig Singleton Methods?Montag, 20. Februar 12
  • Bestimmt!Montag, 20. Februar 12
  • Wetten? ;)Montag, 20. Februar 12
  • Fun fact #2 Class Methods sind Singleton Methods! class Ranking Klassen sind Objekte, von der Klasse Class def self.default_score Daher besitzen sie ebenfalls Singleton Methods 23 end Man vergleiche... end def ranking.rank!; … end def Ranking.default_scoreMontag, 20. Februar 12
  • Methoden in Ruby class Ranking def rank!; end Methode für Instanzen def self.default_score; end Methode für self (also Ranking) endMontag, 20. Februar 12
  • Ruby Object ModelMontag, 20. Februar 12
  • Ruby Object Model BasicObject superclass Object User #<User>Montag, 20. Februar 12
  • Ruby Object Model BasicObject Object superclass Module User Class #<User>Montag, 20. Februar 12
  • 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?!Montag, 20. Februar 12
  • Introducing Singleton ClassMontag, 20. Februar 12
  • 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!Montag, 20. Februar 12
  • Klassen, Singleton Classes, Objects....?! User superclass class #<Class:#<User:0x2A>> singleton class #<User:0x2A>Montag, 20. Februar 12
  • 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 endMontag, 20. Februar 12
  • Methoden finden in Ruby Object class User def self.default_location Singleton Class von "Earth" #<Class:User> end der User Klasse end User hubert = User.new def hubert.resarch #<Class:#<User>> Singleton Class von # researching ... end hubert #<User>Montag, 20. Februar 12
  • Fun Fact #3 Ranking.singleton_class.class_eval {} == Ranking.instance_eval {}Montag, 20. Februar 12
  • self hängt vom Kontext ab Methoden leben in Modulen, Variablen in Objektinstanzen Alle(!) Objektinstanzen haben Singleton ClassesMontag, 20. Februar 12
  • One More Thing …Montag, 20. Februar 12
  • Frage!!Montag, 20. Februar 12
  • Was passiert hier?! class MyClass def outer_method puts "outer" def inner_method NoMethodError: undefined method puts "inner" `inner_method for #<Bar:0x00…68> end end end MyClass.new.inner_methodMontag, 20. Februar 12
  • Was passiert hier?! class MyClass obj = MyClass.new def outer_method obj.outer_method puts "outer" # => outer def inner_method obj.inner_method puts "inner" # => inner end end end Hint: Was ist self?Montag, 20. Februar 12
  • Thanks! Q & A? ? “My Little Pony” © Hasbro Studios and DHX Media Vancouver Dirk Breuer / @railsbros_dirk Sebastian Cohnen / @tisba rubyismagic.deMontag, 20. Februar 12