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  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 12 Dez 2006, 19:09 
Offline
Geselle
Benutzeravatar

Registriert: 09 Aug 2006, 11:49
Beiträge: 148
[hier gehts zurück]
murphy hat geschrieben:
ich überlege seit monaten, ob man eine schönere syntax dafür finden könnte.


Dir.:exists? = File.:directory?
oder sowas.


Das gleiche hab ich mir vor ein paar Tagen gedacht und bin auf etwa sowas gekommen:


1
2
3
4
5
6
def foo
42
end

foo_method = ^foo
foo_method.call # -> 42

Um das jetzt an was anders zu binden:



Dir.^exists? = File.^exists?

Allerdings gefällt mir das mit symbols besser

_________________
[code=]class<<self;define_method(%_>6E9@50>:DD:?8_.tr(%_0-f_,%_\_-t_)){|*_|@_\
=_};end;(Just another Ruby hacker!);(_,@_=@_;$><<_<<%_ _)while@_;$><<$/[/code]


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12 Dez 2006, 21:06 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
problem ist hier nur, ^ gibt es schon (für xor). ist außerdem nicht gerade intuitiv, auch wenn es nett aussieht.

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12 Dez 2006, 21:14 
Offline
Geselle
Benutzeravatar

Registriert: 09 Aug 2006, 11:49
Beiträge: 148
murphy hat geschrieben:
problem ist hier nur, ^ gibt es schon (für xor). ist außerdem nicht gerade intuitiv, auch wenn es nett aussieht.


Es gibt hier kaum noch Operatoren. Und "^" für einarmige Ausdrücke gibts noch nicht :)

_________________
[code=]class<<self;define_method(%_>6E9@50>:DD:?8_.tr(%_0-f_,%_\_-t_)){|*_|@_\
=_};end;(Just another Ruby hacker!);(_,@_=@_;$><<_<<%_ _)while@_;$><<$/[/code]


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12 Dez 2006, 21:28 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
mmh? einarmig? dein ^-vorschlag ist binär...

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 13 Dez 2006, 09:19 
Offline
Rubyist

Registriert: 26 Apr 2006, 21:35
Beiträge: 366
Hi,
hmm ich find das gut. Ist doch recht intuitiv wenn man sich vorstellt, dass die methoden
sozusagen "abgehängt" werden durch den operator und neu gebunden werden, obwohls
natürlich technisch nicht so ist.

greets

_________________



 callcc{|xx| callcc{|yy| lambda{|zz| zz}[yy]}[xx]}["Love Ruby but adore Scheme"]

Solve it once, adapt it to your needs => Schnipsel


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 13 Dez 2006, 15:34 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
wie gesagt, ^ ist bereits verbraucht.

der doppelpunkt ist zwar auch haufenweise überladen in Ruby, aber es gibt noch keine methode ":".

der eigentliche grund für den vorschlag war, dass man methodenobjekte in Ruby inzwichen mit symbolen identifiziert: Object#methods liefert neuerdings ein Array von symbolen, Object#method, Module#define_method usw. erwarten symbole. insofern wäre mir folgende syntax eigentlich am liebsten:


Dir:exists? = File:directory?
das beißt sich aber: zum einen mit simplen aufrufen (method:foo), zum anderen mit der von matz vorgeschlagenen methoden-kombination.

am liebsten würden wir natürlich schreiben:


Dir.exists? = File.directory?
aber das geht nicht, da Ruby methodenaufrufe ohne klammern erlaubt.

deshalb die etwas komische syntax mit .: - meine alte idee aus Love hat sich damit erledigt.

ich könnte versuchen, das zu implementieren, falls es nicht noch bessere vorschläge gibt.

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 19 Dez 2006, 15:48 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Ich kämpfe bei der Idee noch mit so einigen generellen Problemen. Die treten natürlich bei solch einem einfachen Beispiel, wie File.directory? nicht auf. Im Beispiel werden keine Klassen-, oder Instanzvariablen benutzt, das zur Methode gehörige Objekt ist irrelevant und nur der Parameter spielt eine Rolle. Das ist nichts anderes als eine Funktion in einer Nicht-OO-Sprache.

Hier sehe ich nur eine sofort ins Auge fallende Problematik. Wenn beim normalen alias die ursprüngliche Methode umdefiniert wird, bleibt über den Aliasnamen der Bezug auf die vorhergehende Definition erhalten. Das wird ja in Beispielen auch häufig benutzt, wenn die ursprüngliche Methode unter dem gleichen Namen erweitert werden soll - eine Vorgehensweise, die typisch für Ruby ist.

Ganz anders sieht es doch mit klassenübergreifendem Aliasing aus. Hier wird sich direkt auf eine Methode einer anderen Klasse bezogen. Wenn diese dynamisch verändert wird, ändert sich auch die Aliasmethode.

Ein Problem, genauer gesagt, eine verwirrende Situation, tritt auch noch mit dem Aufruf einer gleichnamigen Elternmethode durch super auf. Wenn die Elternklasse eine gleichnamige Methode besitzt, wie die durch das klassenübergreifende Aliasing erzeugte, würde ein super in der fremden Methode deren Vererbungshierarchie durchlaufen.

Über auftretende Probleme mit gleichnamigen Klassen- und Instanzvariablen habe ich noch garnicht weiter nachgedacht. Das könnte aber durchaus problematisch werden.

Bleibt noch die Frage, wie es mit klassenübergreifendem Aliasing für Instanzmethoden aussehen soll. Ich meine, das würde doch bedeuten, dass eine Methode für ein Objekt einer Art (=Klasse plus Ducktyping) aufgerufen werden würde, für die sie nie vorgesehen war. Wenn dann in einer Methode eine weitere aufgerufen wird, die es in beiden Klassen gibt - was soll denn dann geschehen?

Ich habe bei der Sache ein bisschen Bauchweh. Irgendwie ist das nicht spruchreif.

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 19 Dez 2006, 16:16 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
ich glaube, sobald es komplizierter wird, benutzt man die alte methode: neue methode definieren, die die alte aufruft.

_________________
Ruby-Mine | (almost) murphy.de | rubychan.de


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 19 Dez 2006, 17:18 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Ich vermute auch, dass da jede allgemeingültige Lösung viel zu kompliziert werden würde.

_________________
WoNáDo.set_state!(:retired)


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

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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