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  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Set in to_s Methode anzeigen...
BeitragVerfasst: 12 Jun 2011, 12:38 
Offline
Lehrling

Registriert: 22 Mär 2011, 18:38
Beiträge: 62
Hallo zusammen,

ich habe eine Klasse Relation, die ein Set als Instanzvariable beinhaltet, welches die Paare dieser Relation speichert. Jetzt versuche ich gerade eine geeignete to_s Methode zu schreiben um diese Relation auch schön anzeigen zu lassen. Ich dachte ich könnte dieses wie folgt machen:



1
2
3
def to_s()
return "R = {#@paare}"
end


Diesses liefert leider nur folgendes Ergebnis: R = {#<Set:0x1352b8>}

Was muss ich jetzt machen, damit er die inhalte vom Set in die Klammern schreibt?

Das Ergebnis sollte in etwa so aussehen: R = {(1,2),(2,2),(2,3),(1,3)}


Besten Gruß, Ole!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 12 Jun 2011, 14:47 
Offline
Interpreter
Benutzeravatar

Registriert: 21 Mai 2007, 11:30
Beiträge: 1283
Wohnort: Thüringen
Verwendest du die Set Klasse aus der Standardlibrary? Wenn du darauf die Methode #inspect ausführst, bekommst du Einsicht in den Inhalt der Set (gibt dir dann sowas aus wie "#<Set {1, 2, 3}>").
Du kannst dir aber auch ganz einfach eine eigene, schönere to_s Methode schreiben:



1
2
3
4
5
class Relation
def to_s
"{" << @set.entries.map {|(l, r)| "(#{l}, #{r})"}.join(", ") << "}"
end
end


Mit map führst du die mitgegebene Funktion auf alle Elemente (= Paare von (l, r) Werten) deines Sets aus und gibt einen Array aus den Rückgabewerten zurück. Die Funktion schreibt die Elemente in Strings der Form "(l, r)". Mit join lässt du die Rückgabewerte (die Strings (l, r)) mit Kommata verknüpfen. Am Ende fügst du vorne und hinten noch eine geschweifte Klammer dran.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 12 Jun 2011, 15:22 
Offline
Lehrling

Registriert: 22 Mär 2011, 18:38
Beiträge: 62
Hi,

yea, besten dank, damit konnte ich was anfangen... habs jetzt so gelöst:



1
2
3
def to_s()
return "R = {" << @paare.entries.map {|var| "#{var}"}.join(",") << "}"
end


Besten Dank noch einmal für die Info! Gruß Ole!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 14 Jun 2011, 10:37 
Offline
Geselle

Registriert: 01 Mai 2005, 20:43
Beiträge: 163
Hallo Ole,

ich glaube, du wolltest in deinem ersten Beitrag "#{...}" schreiben (Position von # beachten). Auf diese Weise umgehst du die << und kannst den gesamten Ausdruck als einen String ausgeben.
Um die von dir gewünschte Form zu bekommen, brauchst du allerdings trotzdem noch die map-Funktion, die Kai gepostet hat.

Gruß, Anfänger


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 14 Jun 2011, 10:47 
Offline
Lehrling

Registriert: 22 Mär 2011, 18:38
Beiträge: 62
Hi, da verstehe ich ehrlich gesagt nicht so ganz was du meinst... Kannst du das noch etwas genauer erläutern? Grüße!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 14 Jun 2011, 15:14 
Offline
Interpreter
Benutzeravatar

Registriert: 21 Mai 2007, 11:30
Beiträge: 1283
Wohnort: Thüringen
Nee, Mole hat das schon richtig gemacht. Bei Variablen, die ein Zeichen davor haben (@, @@ und $) darf man das #{} durch ein einfaches # ersetzen. Darum ist "#@bla" genauso möglich wie "#{@bla}".


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 17 Jun 2011, 10:39 
Offline
Geselle

Registriert: 01 Mai 2005, 20:43
Beiträge: 163
Und schon wieder was gelernt :wink:

@Mole23
Ich hatte gedacht, die geschweiften Klammern gehören zu der Syntax um Variablen in Strings darzustellen. In der Lösung von Kai tauchen << auf und mit dem #{...} oder dem einfachen # hättest du die Ausgabe in einen String packen können, wenn es dir lieber gewesen wäre.



return "R = #{@a.entries.map{|var| "#{var}"}.join(",")}"

Die Variante mit den << ist wahrscheinlich übersichtlicher, doch es geht eben auch ohne.
Gruß, Anfänger


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 17 Jun 2011, 14:43 
Offline
Lehrling

Registriert: 22 Mär 2011, 18:38
Beiträge: 62
Das stimmt natürlich... Sieht auch besser aus... Gruß


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 17 Jun 2011, 21:32 
Offline
ri
Benutzeravatar

Registriert: 08 Apr 2006, 17:03
Beiträge: 788
Wohnort: Berlin
Mole23 hat geschrieben:
Hi,

yea, besten dank, damit konnte ich was anfangen... habs jetzt so gelöst:



1
2
3
def to_s()
return "R = {" << @paare.entries.map {|var| "#{var}"}.join(",") << "}"
end



und könntest du vielleicht noch die leeren Klammern bei der Methodendefinition weglassen? Bei Ruby (oder auch Ada) sind die komplett überflüssig, falls keine Argumente übergeben werden.

-Thomas

_________________
"Programs must be written for people to read, and only incidentally
for machines to execute."
- H. Abelson and G. Sussman
(in "The Structure and Interpretation of Computer Programs)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 17 Jun 2011, 21:50 
Offline
Lehrling

Registriert: 22 Mär 2011, 18:38
Beiträge: 62
Ich weiß, habe vorher ein paar Jahre AS3 und Java geschrieben, meine Professorin lacht sich auch immer kaputt, wenn die meinen Rubycode sieht... Klassenvariablen, Attributreader, get_instance_variable, scheint alles nicht so rubytypisch zu sein, wie ich nach und nach feststellen muss...

Wobei man nach einem halben Jahr auch ein bissle gefallen an Ruby findet... :D


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 22 Jun 2011, 19:10 
Offline
Interpreter
Benutzeravatar

Registriert: 02 Jan 2005, 20:15
Beiträge: 1360



def to_s()   


Mein Lieblingsargument gegen () ist das sie nicht notwendig sind. Sie geben dir keine Information, vor allem nicht wenn die Methode sowieso kein Argument verwendet. Du kannst die () einfach weglassen und dein Auge muss sich auf weniger Characters konzentrieren!

Auch beim Aufruf lass ich die () weg. Die brauche ich so gut wie nie wenn kein Argument übergeben wird.



object.to_s

vs



object.to_s()

Aber:



object.to_s(5)

ist besser als



object.to_s 5

Leider machen recht viele folgendes:



def foo bla, egr, *args

Das kann ich absolut nicht leiden.

_________________
Retired. Macht es gut!


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Set in to_s Methode anzeigen...
BeitragVerfasst: 22 Jun 2011, 21:06 
Offline
Lehrling

Registriert: 22 Mär 2011, 18:38
Beiträge: 62
Ok, seh ich ein, aber für son alten Javafuchs wie mich sind die Klammern wie ein zweites Zuhause :D


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

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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: