false
-tag?("") # -> true
-tag?(" false
-tag?("p>") # -> false
+Test = create_class(Object)
+t = Test.new
+t.who_am_i
```
\ No newline at end of file
diff --git a/Assignment_035/readme.md b/Assignment_035/readme.md
index 6556c52..83e1660 100644
--- a/Assignment_035/readme.md
+++ b/Assignment_035/readme.md
@@ -1,13 +1,7 @@
-# Reguläre Ausdrücke: Matching
+# Methoden dynamisch aufrufen
📆 **Fällig: ----** 📆 [Musterlösung](solution/)
-Schreiben Sie eine Funktion `reverser`, die bei einem String, der aus zwei Wörtern besteht (durch Leerzeichen getrennt), diese umdreht. Verwenden Sie hierzu einen Regulären Ausdruck.
+Schreiben Sie eine Funktion `crazy_caller`, der man ein Objekt übergeben kann. Die Funktion schaut nach, welche Methoden auf dem Objekt aufrufbar sind und ruft dann alle Methoden auf, die keinen Parameter benötigen.
-Beispiel:
-
-```ruby
-s = "Ruby Programmierer"
-puts reverser(s)
-# -> "Programmierer Ruby"
-```
\ No newline at end of file
+Einige Methoden werden einen Fehler werfen, fangen Sie diesen ab.
\ No newline at end of file
diff --git a/Assignment_035/solution/readme.md b/Assignment_035/solution/readme.md
index eb2ef8e..adaa483 100644
--- a/Assignment_035/solution/readme.md
+++ b/Assignment_035/solution/readme.md
@@ -1,21 +1,27 @@
-# Lösung: Reguläre Ausdrücke: Matching
+# Lösung: Methoden dynamisch aufrufen
-
```ruby
-def reverser(s)
- /(.*) (.*)/ =~ s
- "#{$2} #{$1}"
+
```ruby
+def crazy_caller(obj)
+ # Methoden suchen
+ obj.methods.each do |m|
+ # m enthält ein Symbol mit dem Namen der Methode,
+ # wir wollen aber das Methoden-Objekt
+ method = obj.method(m)
+
+ begin
+ # Methode aufrufen, wenn sie keinen Parameter hat
+ method.call {} if method.arity == 0
+ rescue
+ end
+ end
end
-puts reverser("Ruby Programmierer")
-```
-
-Alternative Lösung:
-
-```ruby
-def reverser(s)
- m = /(.*) (.*)/.match(s)
- "#{m[2]} #{m[1]}"
+class Test
+ def m1; puts 'm1'; end
+ def m2; puts 'm2'; end
+ def m3(a); puts 'm3'; end
+ def m4(a, b); puts 'm4'; end
end
-puts reverser("Ruby Programmierer")
+crazy_caller(Test.new)
```
\ No newline at end of file
diff --git a/Assignment_036/readme.md b/Assignment_036/readme.md
index 84d9fab..04ee2cf 100644
--- a/Assignment_036/readme.md
+++ b/Assignment_036/readme.md
@@ -1,22 +1,5 @@
-# Klassen per Reflection analysieren
+# Eigenclass einer Klasse
📆 **Fällig: ----** 📆 [Musterlösung](solution/)
-Schreiben Sie eine Methode `analyze`, der man eine Klasse ĂĽbergibt und die dann folgende Informationen zu der Klasse ausgibt:
-
- * Name der Klasse
- * Elternklasse
- * Instanzmethoden
- * Statische Methoden
- * Konstanten
-
-Beispiel:
-
-```console
-> analyze(String)
-Name: String
-Elternklasse: Object
-Instanz-Methoden: [:encode, :include?, ...]
-Statische-Methoden: [:try_convert]
-Konstanten: []
-```
\ No newline at end of file
+Fügen Sie der Klasse `Numeric` über deren _Eigenclass_ eine _statische Methode_ `to_binary` hinzu, der man eine Zahl übergibt und diese in binärer Darstellung als String zurück bekommt.
\ No newline at end of file
diff --git a/Assignment_036/solution/readme.md b/Assignment_036/solution/readme.md
index 6611197..9d87749 100644
--- a/Assignment_036/solution/readme.md
+++ b/Assignment_036/solution/readme.md
@@ -1,13 +1,25 @@
-# Lösung: Klassen per Reflection analysieren
+# Lösung: Eigenclass einer Klasse
```ruby
-def analyze(clazz)
- puts "Name: #{clazz.to_s}"
- puts "Elternklasse: #{clazz.superclass}"
- puts "Instanz-Methoden: #{clazz.instance_methods}"
- puts "Statische-Methoden: #{clazz.singleton_methods}"
- puts "Konstanten: #{clazz.constants}"
+class Numeric
+ class << self
+ def to_binary(n)
+ n.to_s(2)
+ end
+ end
end
-analyze(String)
+puts Numeric::to_binary(47)
+```
+
+Alternative Lösung:
+
+```ruby
+class << Numeric
+ def to_binary(n)
+ n.to_s(2)
+ end
+end
+
+puts Numeric::to_binary(47)
```
diff --git a/Assignment_037/readme.md b/Assignment_037/readme.md
index 00e3a9f..e8eb2a5 100644
--- a/Assignment_037/readme.md
+++ b/Assignment_037/readme.md
@@ -1,20 +1,10 @@
-# Methoden einer Klasse dynamisch erzeugen
+# Eigenclass eines Objektes
📆 **Fällig: ----** 📆 [Musterlösung](solution/)
-Schreiben Sie eine Funktion `leet_class`, die zu jeder vorhandenen (nicht geerbten) Instanzmethode eine weitere Methode hinzufĂĽgt, die den Namen der ursprĂĽnglichen Methode in _Leet Speak_ hat. Die neue Methode muss keine Funktion haben, kann aber auch gerne an die ursprĂĽngliche Methode delegieren.
-
-Beispiel:
+Der unten stehende Code erzeugt zwei Objekte vom Typ `String`. FĂĽgen Sie der _Eigenclass_ von `s2` eine _Methode_ `to_leet` hinzu, die den Inhalt des Objektes in "Leet Speak" ausgibt.
```ruby
-class M
- def hello; end
- def world; end
-end
-
-leet_class(M)
-
-m = M.new
-m.h3ll0
-m.w0rld
+s1 = "Hallo"
+s2 = "Welt"
```
\ No newline at end of file
diff --git a/Assignment_037/solution/readme.md b/Assignment_037/solution/readme.md
index 9794f52..4e3d51e 100644
--- a/Assignment_037/solution/readme.md
+++ b/Assignment_037/solution/readme.md
@@ -1,28 +1,14 @@
-# Lösung: Methoden einer Klasse dynamisch erzeugen
+# Lösung: Eigenclass eines Objektes
```ruby
-def to_leet(s)
- s.tr('aeiou', '43107')
-end
+s1 = "Hallo"
+s2 = "Welt"
-def leet_class(clazz)
- clazz.instance_methods(false).each do |m|
- name = m.to_s
- leet_name = to_leet(name).to_sym
- puts leet_name
- clazz.define_method(leet_name) do |*p|
- end
+class << s2
+ def to_leet
+ self.tr('aeiou', '43107')
end
end
-class M
- def hello; end
- def world; end
-end
-
-leet_class(M)
-
-m = M.new
-m.h3ll0
-m.w0rld
-``
\ No newline at end of file
+puts s2.to_leet
+```
diff --git a/Assignment_038/readme.md b/Assignment_038/readme.md
index a726b77..97d2c92 100644
--- a/Assignment_038/readme.md
+++ b/Assignment_038/readme.md
@@ -1,5 +1,17 @@
-# Klasse dynamisch erzeugen
+# Macro
📆 **Fällig: ----** 📆 [Musterlösung](solution/)
-Schreiben Sie eine Funktion `create_class`, der man den die Superklasse ĂĽbergeben kann. Die Funktion erzeugt dann dynamisch die Klasse und fĂĽgt ihr eine Methode `who_am_i` hinzu, die als Text "Ich bin ein Kind von " + den Namen der Superklasse zurĂĽckgibt.
\ No newline at end of file
+Schreiben Sie ein Modul `Javanator`, das eine Klassen einbinden kann. Durch Aufruf der Methode `javafy` kann die Klasse sich dann die Methode `toString` hinzufĂĽgen lassen, die einfach nur `to_s` aufruft.
+
+Beispiel:
+
+```ruby
+class Test
+ include Javanator
+ Javanator::javafy
+end
+
+t = Test.new
+t.toString
+```
\ No newline at end of file
diff --git a/Assignment_038/solution/readme.md b/Assignment_038/solution/readme.md
index 82fcc15..bbd3801 100644
--- a/Assignment_038/solution/readme.md
+++ b/Assignment_038/solution/readme.md
@@ -1,15 +1,17 @@
-# Lösung: Klasse dynamisch erzeugen
+# Lösung: Macro
```ruby
-def create_class(super_class)
- Class.new(super_class) do
- def who_am_i
- puts "Ich bin ein Kind von #{self.class.superclass}"
- end
+module Javanator
+ def Javanator::javafy
+ def toString; to_s; end
end
end
-Test = create_class(Object)
+class Test
+ include Javanator
+ Javanator::javafy
+end
+
t = Test.new
-t.who_am_i
+t.toString
```
\ No newline at end of file
diff --git a/Assignment_039/readme.md b/Assignment_039/readme.md
index 83e1660..bb4e6ab 100644
--- a/Assignment_039/readme.md
+++ b/Assignment_039/readme.md
@@ -1,7 +1,22 @@
-# Methoden dynamisch aufrufen
+# Metaprogrammierung: Die kleine Petze
📆 **Fällig: ----** 📆 [Musterlösung](solution/)
-Schreiben Sie eine Funktion `crazy_caller`, der man ein Objekt übergeben kann. Die Funktion schaut nach, welche Methoden auf dem Objekt aufrufbar sind und ruft dann alle Methoden auf, die keinen Parameter benötigen.
+Schreiben Sie eine Ruby Klasse `Snitch`, deren Objekte man an jede beliebige Ruby-Methode ĂĽbergeben kann. `Snitch` soll dann auf der Konsole ausgeben, welche Methoden mit welchen Parametern auf ihm aufgerufen wurden.
-Einige Methoden werden einen Fehler werfen, fangen Sie diesen ab.
\ No newline at end of file
+Beispiel:
+
+```ruby
+snitch = Snitch.new
+puts snitch
+```
+
+Ausgabe:
+
+```console
+Aufruf von Methode 'to_ary'
+ mit den Argumenten []
+ mit den Argumenten {}
+ und dem Block
+Aufruf von Methode 'to_s'
+```
\ No newline at end of file
diff --git a/Assignment_039/solution/readme.md b/Assignment_039/solution/readme.md
index adaa483..9573ba3 100644
--- a/Assignment_039/solution/readme.md
+++ b/Assignment_039/solution/readme.md
@@ -1,27 +1,21 @@
-# Lösung: Methoden dynamisch aufrufen
+# Lösung: Metaprogrammierung: Die kleine Petze
-
```ruby
-def crazy_caller(obj)
- # Methoden suchen
- obj.methods.each do |m|
- # m enthält ein Symbol mit dem Namen der Methode,
- # wir wollen aber das Methoden-Objekt
- method = obj.method(m)
-
- begin
- # Methode aufrufen, wenn sie keinen Parameter hat
- method.call {} if method.arity == 0
- rescue
- end
+
```ruby
+class Snitch
+ def method_missing(name, *args, **keywords, &block)
+ puts "Aufruf von Methode '#{name}'"
+ puts " mit den Argumenten #{args}"
+ puts " mit den Argumenten #{keywords}"
+ puts " und dem Block #{block}"
end
+
+ def to_s
+ puts "Aufruf von Methode 'to_s'"
+ end
+
+ # Weiter Methoden von Object ĂĽberschreiben. Hier weggelassen.
end
-class Test
- def m1; puts 'm1'; end
- def m2; puts 'm2'; end
- def m3(a); puts 'm3'; end
- def m4(a, b); puts 'm4'; end
-end
-
-crazy_caller(Test.new)
-```
\ No newline at end of file
+snitch = Snitch.new
+puts snitch
+```
diff --git a/Assignment_040/readme.md b/Assignment_040/readme.md
index 04ee2cf..d4ded85 100644
--- a/Assignment_040/readme.md
+++ b/Assignment_040/readme.md
@@ -1,5 +1,10 @@
-# Eigenclass einer Klasse
+# Singleton Methoden
📆 **Fällig: ----** 📆 [Musterlösung](solution/)
-Fügen Sie der Klasse `Numeric` über deren _Eigenclass_ eine _statische Methode_ `to_binary` hinzu, der man eine Zahl übergibt und diese in binärer Darstellung als String zurück bekommt.
\ No newline at end of file
+Der unten stehende Code erzeugt zwei Objekte vom Typ `String`. FĂĽgen Sie `s2` eine _Singleton Methode_ `to_leet` hinzu, die den Inhalt des Objektes in "Leet Speak" ausgibt.
+
+```ruby
+s1 = "Hallo"
+s2 = "Welt"
+```
\ No newline at end of file
diff --git a/Assignment_040/solution/readme.md b/Assignment_040/solution/readme.md
index 9d87749..7d1d480 100644
--- a/Assignment_040/solution/readme.md
+++ b/Assignment_040/solution/readme.md
@@ -1,25 +1,12 @@
-# Lösung: Eigenclass einer Klasse
+# Lösung: Singleton Methoden
```ruby
-class Numeric
- class << self
- def to_binary(n)
- n.to_s(2)
- end
- end
+s1 = "Hallo"
+s2 = "Welt"
+
+def s2.to_leet
+ self.tr('aeiou', '43107')
end
-puts Numeric::to_binary(47)
-```
-
-Alternative Lösung:
-
-```ruby
-class << Numeric
- def to_binary(n)
- n.to_s(2)
- end
-end
-
-puts Numeric::to_binary(47)
+puts s2.to_leet
```
diff --git a/Assignment_041/readme.md b/Assignment_041/readme.md
index e8eb2a5..e13d278 100644
--- a/Assignment_041/readme.md
+++ b/Assignment_041/readme.md
@@ -1,10 +1,15 @@
-# Eigenclass eines Objektes
+# Struct
📆 **Fällig: ----** 📆 [Musterlösung](solution/)
-Der unten stehende Code erzeugt zwei Objekte vom Typ `String`. FĂĽgen Sie der _Eigenclass_ von `s2` eine _Methode_ `to_leet` hinzu, die den Inhalt des Objektes in "Leet Speak" ausgibt.
+Verwenden Sie die Klasse `Struct`, um sehr einfach eine Klasse zur Verwaltung von Studierenden (`Studierender`) zu erzeugen. Ein Studierender hat folgende Eigenschaften:
-```ruby
-s1 = "Hallo"
-s2 = "Welt"
-```
\ No newline at end of file
+ * Vorname
+ * Nachname
+ * Geburtsdatum
+ * Matrikelnummer
+ * Fakultät
+
+FĂĽgen Sie eine `to_s`-Methode zur Klasse hinzu, die nur die Matrikelnummer zurĂĽckgibt.
+
+Erzeugen Sie danach ein Objekt von Ihrer Klasse.
\ No newline at end of file
diff --git a/Assignment_041/solution/readme.md b/Assignment_041/solution/readme.md
index 4e3d51e..ac39a0c 100644
--- a/Assignment_041/solution/readme.md
+++ b/Assignment_041/solution/readme.md
@@ -1,14 +1,16 @@
-# Lösung: Eigenclass eines Objektes
+# Lösung: Struct
```ruby
-s1 = "Hallo"
-s2 = "Welt"
+# Klasse (sic!) ĂĽber Struct erzeugen
+Studierender = Struct.new(:vorname, :nachname, :geboren, :matrikel, :fakultaet)
-class << s2
- def to_leet
- self.tr('aeiou', '43107')
+# KLasse noch einmal öffnen und Methode hinzufügen
+class Studierender
+ def to_s
+ matrikel
end
end
-puts s2.to_leet
+peter = Studierender.new('Peter', 'Meier', '15.03.1998', '123222', 'I')
+puts peter
```
diff --git a/readme.md b/readme.md
index c456d6f..14fa6bd 100644
--- a/readme.md
+++ b/readme.md
@@ -13,44 +13,39 @@ Die **Abgabedaten** haben keine Bedeutung, da der Kurs keine PrĂĽfung beinhaltet
| 3. | [String-Formatierung](Assignment_003/readme.md) | **----** |
| 4. | [Parallele Zuweisung](Assignment_004/readme.md) | **----** |
| 5. | [Ranges](Assignment_005/readme.md) | **----** |
-| 6. | [Aufgabenblock 1: Ruby Grundlagen](Assignment_006/readme.md) | **----** |
-| 7. | [Splat](Assignment_007/readme.md) | **----** |
-| 8. | [Symbole](Assignment_008/readme.md) | **----** |
-| 9. | [Zugriffsmethoden](Assignment_009/readme.md) | **----** |
-| 10. | [Klasse deklarieren](Assignment_010/readme.md) | **----** |
-| 11. | [Default Parameter](Assignment_011/readme.md) | **----** |
-| 12. | [Vererbung](Assignment_012/readme.md) | **----** |
-| 13. | [Keyword-Parameter](Assignment_013/readme.md) | **----** |
-| 14. | [Mixin benutzen](Assignment_014/readme.md) | **----** |
-| 15. | [Modul schreiben](Assignment_015/readme.md) | **----** |
-| 16. | [Monkey Patch](Assignment_016/readme.md) | **----** |
-| 17. | [Geschachtelte Methoden](Assignment_017/readme.md) | **----** |
-| 18. | [Aufgabenblock 2: Ruby Klassen](Assignment_018/readme.md) | **----** |
-| 19. | [Vararg-Methoden](Assignment_019/readme.md) | **----** |
-| 20. | [Arrays](Assignment_020/readme.md) | **----** |
-| 21. | [Callback mit Block](Assignment_021/readme.md) | **----** |
-| 22. | [Callback mit Proc](Assignment_022/readme.md) | **----** |
-| 23. | [Closure](Assignment_023/readme.md) | **----** |
-| 24. | [Hashes und Blöcke](Assignment_024/readme.md) | **----** |
-| 25. | [Hashes](Assignment_025/readme.md) | **----** |
-| 26. | [Map](Assignment_026/readme.md) | **----** |
-| 27. | [Aufgabenblock 3: Ruby Container](Assignment_027/readme.md) | **----** |
-| 28. | [Map und Reduce](Assignment_028/readme.md) | **----** |
-| 29. | [Ausnahmen](Assignment_029/readme.md) | **----** |
-| 30. | [Klasse Dir und IO](Assignment_030/readme.md) | **----** |
-| 31. | [Iteratoren auf Zahlen](Assignment_031/readme.md) | **----** |
-| 32. | [Quine](Assignment_032/readme.md) | **----** |
-| 33. | [Aufgabenblock 4: Ruby Typen](Assignment_033/readme.md) | **----** |
-| 34. | [Reguläre Ausdrücke: Match](Assignment_034/readme.md) | **----** |
-| 35. | [Reguläre Ausdrücke: Matching](Assignment_035/readme.md) | **----** |
-| 36. | [Klassen per Reflection analysieren](Assignment_036/readme.md) | **----** |
-| 37. | [Methoden einer Klasse dynamisch erzeugen](Assignment_037/readme.md) | **----** |
-| 38. | [Klasse dynamisch erzeugen](Assignment_038/readme.md) | **----** |
-| 39. | [Methoden dynamisch aufrufen](Assignment_039/readme.md) | **----** |
-| 40. | [Eigenclass einer Klasse](Assignment_040/readme.md) | **----** |
-| 41. | [Eigenclass eines Objektes](Assignment_041/readme.md) | **----** |
-| 42. | [Macro](Assignment_042/readme.md) | **----** |
-| 43. | [Metaprogrammierung: Die kleine Petze](Assignment_043/readme.md) | **----** |
-| 44. | [Aufgabenblock 5: Fortgeschrittene Themen](Assignment_044/readme.md) | **----** |
-| 45. | [Singleton Methoden](Assignment_045/readme.md) | **----** |
-| 46. | [Struct](Assignment_046/readme.md) | **----** |
+| 6. | [Splat](Assignment_006/readme.md) | **----** |
+| 7. | [Symbole](Assignment_007/readme.md) | **----** |
+| 8. | [Zugriffsmethoden](Assignment_008/readme.md) | **----** |
+| 9. | [Klasse deklarieren](Assignment_009/readme.md) | **----** |
+| 10. | [Default Parameter](Assignment_010/readme.md) | **----** |
+| 11. | [Vererbung](Assignment_011/readme.md) | **----** |
+| 12. | [Keyword-Parameter](Assignment_012/readme.md) | **----** |
+| 13. | [Mixin benutzen](Assignment_013/readme.md) | **----** |
+| 14. | [Modul schreiben](Assignment_014/readme.md) | **----** |
+| 15. | [Monkey Patch](Assignment_015/readme.md) | **----** |
+| 16. | [Geschachtelte Methoden](Assignment_016/readme.md) | **----** |
+| 17. | [Vararg-Methoden](Assignment_017/readme.md) | **----** |
+| 18. | [Arrays](Assignment_018/readme.md) | **----** |
+| 19. | [Callback mit Block](Assignment_019/readme.md) | **----** |
+| 20. | [Callback mit Proc](Assignment_020/readme.md) | **----** |
+| 21. | [Closure](Assignment_021/readme.md) | **----** |
+| 22. | [Hashes und Blöcke](Assignment_022/readme.md) | **----** |
+| 23. | [Hashes](Assignment_023/readme.md) | **----** |
+| 24. | [Map](Assignment_024/readme.md) | **----** |
+| 25. | [Map und Reduce](Assignment_025/readme.md) | **----** |
+| 26. | [Ausnahmen](Assignment_026/readme.md) | **----** |
+| 27. | [Klasse Dir und IO](Assignment_027/readme.md) | **----** |
+| 28. | [Iteratoren auf Zahlen](Assignment_028/readme.md) | **----** |
+| 29. | [Quine](Assignment_029/readme.md) | **----** |
+| 30. | [Reguläre Ausdrücke: Match](Assignment_030/readme.md) | **----** |
+| 31. | [Reguläre Ausdrücke: Matching](Assignment_031/readme.md) | **----** |
+| 32. | [Klassen per Reflection analysieren](Assignment_032/readme.md) | **----** |
+| 33. | [Methoden einer Klasse dynamisch erzeugen](Assignment_033/readme.md) | **----** |
+| 34. | [Klasse dynamisch erzeugen](Assignment_034/readme.md) | **----** |
+| 35. | [Methoden dynamisch aufrufen](Assignment_035/readme.md) | **----** |
+| 36. | [Eigenclass einer Klasse](Assignment_036/readme.md) | **----** |
+| 37. | [Eigenclass eines Objektes](Assignment_037/readme.md) | **----** |
+| 38. | [Macro](Assignment_038/readme.md) | **----** |
+| 39. | [Metaprogrammierung: Die kleine Petze](Assignment_039/readme.md) | **----** |
+| 40. | [Singleton Methoden](Assignment_040/readme.md) | **----** |
+| 41. | [Struct](Assignment_041/readme.md) | **----** |