.class
herausfinden.sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> puts 'Hello World!' Hello World! => nil 1.9.3p194 :002:0> puts 'Hello World!' Hello World! => nil 1.9.3p194 :003:0> puts 'Hello World!' Hello World! => nil 1.9.3p194 :004:0> exit
drei_mal
), mit der sich das
alles auf einmal erledigen lässt.sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> def drei_mal # Start der Definition 1.9.3p194 :002:1> puts 'Hello World!' 1.9.3p194 :003:1> puts 'Hello World!' 1.9.3p194 :004:1> puts 'Hello World!' 1.9.3p194 :005:1> end # Ende der Definition => nil 1.9.3p194 :006:0> drei_mal # Aufruf der Methode Hello World! Hello World! Hello World! => nil 1.9.3p194 :007:0> exit
sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> def drei_mal(apfelmus) 1.9.3p194 :002:1> puts apfelmus 1.9.3p194 :003:1> puts apfelmus 1.9.3p194 :004:1> puts apfelmus 1.9.3p194 :005:1> end => nil 1.9.3p194 :006:0> drei_mal('Hello World!') Hello World! Hello World! Hello World! => nil
1.9.3p194 :007:0> drei_mal 'Hello World!'
Hello World!
Hello World!
Hello World!
=> nil
;-)
wrong number of
arguments
“:1.9.3p194 :008:0> drei_mal ArgumentError: wrong number of arguments (0 for 1) from (irb):8 from /usr/local/bin/irb:12:in `<main>' 1.9.3p194 :009:0> exit
apfelmus
einen
Default-Wert geben und dann die Methode auch ohne Parameter
aufrufen:sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> def drei_mal(apfelmus = 'blau') 1.9.3p194 :002:1> puts apfelmus 1.9.3p194 :003:1> puts apfelmus 1.9.3p194 :004:1> puts apfelmus 1.9.3p194 :005:1> end => nil 1.9.3p194 :006:1 > drei_mal('Hello World!') Hello World! Hello World! Hello World! => nil 1.9.3p194 :007:1 > drei_mal blau blau blau => nil 1.9.3p194 :008:1 > exit
Dies_und_das
gehört. Dann würde sie in einem
Ruby-Programm folgendermaßen definiert:class Dies_und_das # Beginn der Klassendefinition def drei_mal puts 'Hello World!' puts 'Hello World!' puts 'Hello World!' end end # Ende der Klassendefinition
irb
durch:sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> class Dies_und_das 1.9.3p194 :002:1> def drei_mal 1.9.3p194 :003:2> puts 'Hello World!' 1.9.3p194 :004:2> puts 'Hello World!' 1.9.3p194 :005:2> puts 'Hello World!' 1.9.3p194 :006:2> end 1.9.3p194 :007:1> end => nil
drei_mal
aufzurufen:1.9.3p194 :008:0> Dies_und_das.drei_mal
NoMethodError: undefined method `drei_mal' for Dies_und_das:Class
from (irb):8
from /usr/local/bin/irb:12:in `<main>'
Dies_und_das
ist eine Klasse und keine Instanz.
Da wir hier mit Instanz-Methoden arbeiten, funktioniert es nur, wenn wir
vorher ein neues Objekt (also eine neue Instanz) der Klasse
Dies_und_das
mit der Klassen-Methode
new
erzeugt haben:1.9.3p194 :009:0> abc = Dies_und_das.new => #<Dies_und_das:0x9ebb3f0> 1.9.3p194 :010:0> abc.drei_mal Hello World! Hello World! Hello World! => nil 1.9.3p194 :011:0> exit
private
aufgeführt.sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> class Beispiel # Klasse Beispiel 1.9.3p194 :002:1> def mach_was # Methode mach_was 1.9.3p194 :003:2> puts 'Was.' 1.9.3p194 :004:2> end 1.9.3p194 :005:1> def mach_noch_was # Methode mach_noch_was 1.9.3p194 :006:2> puts 'Noch was.' 1.9.3p194 :007:2> end 1.9.3p194 :008:1> 1.9.3p194 :009:1* private # Beginn der privaten Methoden 1.9.3p194 :010:1> def noch_mehr # Methode noch_mehr 1.9.3p194 :011:2> puts 'Noch was.' 1.9.3p194 :012:2> end 1.9.3p194 :013:1> end => nil 1.9.3p194 :014:0> test = Beispiel.new # Neue Instanz von Beispiel => #<Beispiel:0x8bb6ffc> 1.9.3p194 :015:0> test.mach_was # Methode .mach_was aufrufen Was. => nil 1.9.3p194 :016:0> test.mach_noch_was # Methode .mach_noch_was aufrufen Noch was. => nil 1.9.3p194 :017:0> test.noch_mehr # Kann nicht von außen aufgerufen werden. NoMethodError: private method `noch_mehr' called for #<Beispiel:0x8bb6ffc> from (irb):17 from /usr/local/bin/irb:12:in `<main>' 1.9.3p194 :018:0> exit
new
aufgerufen), dann wird als Erstes und
automatisch die Methode initialize
abgearbeitet. Die Methode ist automatisch eine private Methode, auch
wenn sie nicht explizit im Bereich private
aufgeführt wird.sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> class Beispiel 1.9.3p194 :002:1> def initialize 1.9.3p194 :003:2> puts 'Hello World!' 1.9.3p194 :004:2> end 1.9.3p194 :005:1> end => nil 1.9.3p194 :006:0> test = Beispiel.new Hello World! => #<Beispiel:0x99f1e24> 1.9.3p194 :007:0> exit
test
wird mit Beispiel.new
erstellt, und dabei wird zuerst die Methode
initialize
abgearbeitet. Deshalb sieht man im
irb die puts
-Ausgabe aus der irb-Zeile 3.new
akzeptiert die bei der
Methode initialize
angegebenen
Parameter:sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> class Beispiel 1.9.3p194 :002:1> def initialize(aaa) # Definition Parameter aaa 1.9.3p194 :003:2> puts aaa # Ausgabe von aaa 1.9.3p194 :004:2> end 1.9.3p194 :005:1> end => nil 1.9.3p194 :006:0> test = Beispiel.new('Hello World!') Hello World! => #<Beispiel:0x86bed84> 1.9.3p194 :007:0> exit
<
(Kleiner-als-Zeichen) angefügt
werden:class Beispiel < ElternklasseVon dieser Möglichkeit wird in Rails sehr oft Gebrauch gemacht (ansonsten würde ich Sie damit hier nicht behelligen).
Literatur
und fügen die Methode
antwort_auf_alle_fragen_des_universums
hinzu.
Danach definieren wir eine Klasse
Allgemeinwissen
und vererben dorthin die Klasse
Literatur
. Die Instanz egon
hat
Zugriff auf alle Methoden und die Instanz fritz
nur auf
die der Klasse Literatur
.[14]sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> class Literatur 1.9.3p194 :002:1> def antwort_auf_alle_fragen_des_universums 1.9.3p194 :003:2> 42 1.9.3p194 :004:2> end 1.9.3p194 :005:1> end => nil 1.9.3p194 :006:0> class Allgemeinwissen < Literatur 1.9.3p194 :007:1> def pi 1.9.3p194 :008:2> 3.14 1.9.3p194 :009:2> end 1.9.3p194 :010:1> end => nil 1.9.3p194 :011:0> fritz = Literatur.new => #<Literatur:0x90e7098> 1.9.3p194 :012:0> egon = Allgemeinwissen.new => #<Allgemeinwissen:0x90da0ac> 1.9.3p194 :013:0> egon.antwort_auf_alle_fragen_des_universums => 42 1.9.3p194 :014:0> egon.pi => 3.14 1.9.3p194 :015:0> fritz.antwort_auf_alle_fragen_des_universums => 42 1.9.3p194 :016:0> fritz.pi NoMethodError: undefined method `pi' for #<Literatur:0x90e7098> from (irb):21 from /usr/local/bin/irb:12:in `<main>' 1.9.3p194 :017:0> exit
new
erstellt. Eine Klassen-Methode kann nur
im Zusammenhang mit der Klasse aufgerufen werden (die Methode
new
ist zum Beispiel eine Klassen-Methode).
Eine Instanz-Methode ist eine Methode, die nur mit einer Instanz
funktioniert. So können Sie nicht die Methode
new
auf eine Instanz anwenden.sw@debian:~/sandbox$ irb ruby-1.9.2-p0 > class Wohnung 1.9.3p194 ?> def putzen 1.9.3p194 ?> puts 'Wirklich?' 1.9.3p194 ?> end 1.9.3p194 ?> end => nil 1.9.3p194 > Wohnung.putzen NoMethodError: undefined method `putzen' for Wohnung:Class from (irb):15 from /Users/stefan/.rvm/rubies/1.9.3p194/bin/irb:17:in `<main>' 1.9.3p194 >
1.9.3p194 > apfelmus = Wohnung.new => #<Wohnung:0x00000100a06990> 1.9.3p194 > apfelmus.putzen Wirklich? => nil 1.9.3p194 >
1.9.3p194 > class Apfelkuchen 1.9.3p194 ?> def self.backen 1.9.3p194 ?> puts 'sinnfreies Beispiel' 1.9.3p194 ?> end 1.9.3p194 ?> end => nil 1.9.3p194 > Apfelkuchen.backen sinnfreies Beispiel => nil 1.9.3p194 >
1.9.3p194 > lieblingskuchen = Apfelkuchen.new => #<Apfelkuchen:0x0000010181a9c8> 1.9.3p194 > lieblingskuchen.backen NoMethodError: undefined method `backen' for #<Apfelkuchen:0x0000010181a9c8> from (irb):25 from /Users/stefan/.rvm/rubies/1.9.3p194/bin/irb:17:in `<main>' 1.9.3p194 >
self.xyz
# Variante 1 # mit self.xyz # class Apfelmus def self.backen puts 'sinnfreies Beispiel' end end
class << self
# Variante 2 # mit class << self # class Apfelmus class << self def backen puts 'sinnfreies Beispiel' end end end
instance_methods
alle definierten Methoden
auslesen. Wir probieren das mit der Klasse
Dies_und_das
aus (diese legen wir dazu noch
mal neu im irb an):sw@debian:~/sandbox$ irb 1.9.3p194 :001:0> class Dies_und_das 1.9.3p194 :002:1> def drei_mal 1.9.3p194 :003:2> puts 'Hello World!' 1.9.3p194 :004:2> puts 'Hello World!' 1.9.3p194 :005:2> puts 'Hello World!' 1.9.3p194 :006:2> end 1.9.3p194 :007:1> end => nil 1.9.3p194 :008:0> Dies_und_das.instance_methods => [:drei_mal, :nil?, :===, :=~, :!~, :eql?, :class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :hash, :__id__, :object_id, :to_enum, :enum_for, :gem, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
1.9.3p194 :009:0> Dies_und_das.instance_methods(false)
=> [:drei_mal]
1.9.3p194 :010:0>