ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rückgabewert von geerbten Methoden
BeitragVerfasst: 09 Mär 2015, 10:31 
Offline
Novize

Registriert: 19 Okt 2014, 19:20
Beiträge: 11
Guten Morgen.

Nehmen wir an ich will eine Klasse MyArray schreiben, die von Array erbt.
Wenn ich für ein Objekt dieser Klasse eine von Array geerbte Methode aufrufe, die das Objekt verändert und zurückgibt, dann ist der Rückgabewert (logischerweise) ein Objekt der Klasse MyArray.


1
2
3
a = MyArray.new
b = a.shuffle!
b.class #=> MyArray

Wenn man aber eine Methode der Klasse Array aufruft, die das Objekt nicht verändert, sondern ein neues, verändertes Objekt zurückgibt, dann ist der Rückgabewert ein Objekt der Klasse Array.


1
2
3
a = MyArray.new
b = a.shuffle
b.class #=> Array

Das ganze Verhalten erscheint total logisch, dennoch ist es in dem Fall nicht das was ich möchte. Die Rückgabewerte im zweiten Fall sollten auch von der Klasse MyArray sein. Na klar, eine Methode to_my_array ist schnell geschrieben. Die dann leider sehr oft aufgerufen werden muss. Die Alternative (bzw. Ergänzung), die Methoden entsprechend zu überschreiben, etwa in der Art:


1
2
3
4
5
class MyArray
def shuffle
super.shuffle.to_my_array
end
end

ist auch nicht grad die Wucht, da kann ich mir die Vererbung dann fast sparen und gleich alles benötigte delegieren...

Gibt es aber einen anderen, eleganteren Weg das gewünschte Verhalten zu erreichen?

Danke im Voraus!

nossek


Nach oben
 Profil  
 
BeitragVerfasst: 09 Mär 2015, 11:58 
Offline
Metaprogrammierer

Registriert: 03 Feb 2008, 15:36
Beiträge: 682
Wohnort: Aachen, NRW
Beware subclassing Ruby core classes. tl;dr: Don't subclass, delegate.

_________________
-


Nach oben
 Profil  
 
BeitragVerfasst: 09 Mär 2015, 14:31 
Offline
Novize

Registriert: 19 Okt 2014, 19:20
Beiträge: 11
Vielen Dank für den sehr informativen Link, der meine Frage in vollem Umfang beantwortet.

Das Module Forwardable kannte ich noch nicht. Es überrascht mich aber nur wenig dass Ruby auf diese Weise einen unkomplizierten Weg bietet, Tonnenweise Boilerplate-Code zu vermeiden.


Nach oben
 Profil  
 
BeitragVerfasst: 11 Mär 2015, 23:09 
Offline
Interpreter
Benutzeravatar

Registriert: 21 Mai 2007, 11:30
Beiträge: 1283
Wohnort: Thüringen
Ich finde daran überhaupt nichts irritierend. Wenn dein custom Array irgendeinen speziellen Construktor hat, kann Ruby schlichtweg keine Instanzen von selbst damit erzeugen.
Beispiel:


1
2
3
4
5
6
7
8
9
10
11
class NamedArray < Array
def initialize name
super()
@name = name
end
end

na = NamedArray.new "bla"
na << 1 << 2 << 3
na.reverse.class #=> Array
na.reverse.name # ??? natuerlich kann das nicht funktionieren


Von daher ist die Vorgehensweise von Ruby imo völlig logisch. Aber der Blogpost hat recht: Man sollte keine Core-Klassen überschreiben.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron