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  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 17 Jan 2007, 18:58 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Mir ist gerade im Zusammenhang mit dem Thread Konvertieren eines Strings [...] Objekt -> Callback [gelö aufgefallen, dass es offensichtlich keine Methoden gibt, um aus einem Method-Objekt die zugehörige Methode und das Objekt zu erhalten.

Bezüglich der Methode gibt es zwar einen hässlichen Umweg...

1
2
3
4
5
6
7
8
9
10
11
12
class Otto
def huhu
puts "Ein 'huhu' eines Otto"
end
end

ein_otto = Otto.new
x = ein_otto.method(:huhu)
x.call # => Ein 'huhu' eines Otto
p x # => #<Method: Otto#huhu>
puts x.to_s.match(/Method:\s*([^#]+)#([^>]+)>/)[1] # => Otto
puts x.to_s.match(/Method:\s*([^#]+)#([^>]+)>/)[2] # => huhu
...aber bezüglich der Id des zugehörigen Objekts habe ich noch nichts gefunden.

Hat jemand von Euch da bessere Informationen?

Falls nicht, sollte man einen RCR schreiben, weil das doch durchaus sinnvolle Informationen sein können.

_________________
WoNáDo.set_state!(:retired)


Zuletzt geändert von WoNáDo am 21 Feb 2007, 18:53, insgesamt 1-mal geändert.

Nach oben
 Profil  
 
BeitragVerfasst: 18 Jan 2007, 02:58 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
WoNáDo hat geschrieben:
...aber bezüglich der Id des zugehörigen Objekts habe ich noch nichts gefunden.
wie schon anderswo ausgeführt, gibt es in Ruby keine eindeutige zuordnung methode --> name.

eine methode kann mehrere namen haben, oder keinen. genau wie ein objekt von mehreren variablen referenziert wird. die frage nach "dem namen der methode x" ist ungefähr so wie die frage nach "dem namen der variable mit dem wert 4".

so habe ich das jedenfalls verstanden.

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


Nach oben
 Profil  
 
BeitragVerfasst: 18 Jan 2007, 03:41 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
murphy hat geschrieben:
WoNáDo hat geschrieben:
...aber bezüglich der Id des zugehörigen Objekts habe ich noch nichts gefunden.
wie schon anderswo ausgeführt, gibt es in Ruby keine eindeutige zuordnung methode --> name.

Ich meinte hier speziell das Objekt, an das mit xyz.method(:irgendeine) die Methode gebunden wird - sprich - ich möchte gerne eine Methode in der Klasse Method, die mir den wert von xyz.object_id ausgibt.

Das kann nämlich sehr interessant werden, wenn man (beispielsweise) ein Array aus Method-Objekten hat und sehen möchte, für welche Objekte denn darin gebundene Methoden gespeichert sind.

Mit dem Methodennamen ist es eigenlich harmlos. Der Name, also die Kombination Klasse#Methode, wird ja durch Method#to_s geliefert. Das ist die Methode der Klasse, die beim Binden der Methode an das Objekt angegeben wurde. Da geht es mir nur um die Darstellung.

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 18 Jan 2007, 03:56 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
huch! tut mir leid, habe die frage falsch verstanden. installiere nebenher meinen Mac neu, da war ich wohl abgelenkt.




eval 'self', x.to_proc.binding
scheint zu funktionieren, aber das ist hässlich.

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


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 18 Jan 2007, 16:08 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Geht leider nicht.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Otto
def huhu
puts "huhu"
end
end

otto = Otto.new
puts otto.object_id # => 22501530 (in diesem Lauf)
x = otto.method(:huhu)
x.call # => huhu
erg = eval 'self', x.to_proc.binding
puts erg # => main
# => erwuenscht waere fuer diesen Lauf: 22501530
puts x.to_s # => #<Method: Otto#huhu>

Wo schreibt man eigentlich Change Proposals für Ruby, ohne dass man in einen Wust von Kram verwickelt wird (dazu habe ich keine Lust).

Ich werde das mal schreiben, weil ich schon finde, dass es eine Methode geben sollte, die die Objekt-Identifikation des zugehörigen Objekts liefert.

Klar, man könnte Object#method manteln und die Objekt-Identifikation von self in einer Instanzvariablen des erzeugten Method-Objekts speichern, sowie die Klasse Method um eine Methode Method#object (oder ein besserer Name) erweitern.

Ich finde aber, dass das in den Kern von Ruby hineingehört.

>>>>> Edit Moderator WoNáDo >>>>>

Ich hab das ins Core-Forum verschoben. Da ja nichts entsprechendes vorhanden ist, geht es ja um die Zukunft :wink:

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 18 Jan 2007, 18:11 
Offline
Obfuscator

Registriert: 18 Feb 2004, 15:47
Beiträge: 560
Wohnort: Erkelenz (Ostlimburg)
WoNáDo hat geschrieben:
Wo schreibt man eigentlich Change Proposals für Ruby, ohne dass man in einen Wust von Kram verwickelt wird (dazu habe ich keine Lust).


Du könntest es auf ruby-talk/comp.lang.ruby ansprechen, um die Meinungen der Gurus unverbindlich einzuholen. Wenn Du keine Lust hast, in der High-traffic-Gruppe auf Antworten zu achten, dann weis mich auf die Fragemail hin, und ich gebe Dir hier oder in de.comp.lang.ruby über die Reaktionen bescheid.

Anbei, d.h. OT: ich meine, mich erinnern zu können, daß Du laut eigener Aussage in comp.lang.ruby nicht mitliest, weil Dir der dortige Datenumsatz für dein Modem zu hoch ist. Wie schaffst Du es, ein Modem mit einer Usenet-Gruppe zu überfordern? Lädst Du immer alle Nachrichten herunter, bevor Du Dich entscheidest, welche Du lesen willst?

Grüße, Malte


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 18 Jan 2007, 18:35 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Modem war mal :D Ich habe allerdings meist die Inhalte runtergeladen, da mir aus den Überschriften meist nicht klar wurde um was es geht...

Ich muss allerdings sagen, dass ich vieles dort nicht sooo interessant fand, zumal ich mich eigentlich in viele Teile der Ruby-Entwicklung nicht einmischen will. Dahinter steht, dass ich wesentliche Elemente nicht benutze - alles was mit Netzwerken und Internet zu tun hat, und auch wesentliches zu GUIs - so dass ich mit meiner Nischensicht (hauptsächlich Textanalysen und freilebende Objekte) nur die mich direkt betreffenden Teile ansprechen kann. Alles andere wäre anmassend.

Ich werde mal einfach die derzeitigen zwei Themen (das hier und Vorzeichenermittlung) dort mit Beschreibung unterbringen und sie sich der Diskussion überlassen. Es drängt ja ein bisschen die Zeit, weil demnächst alles für Ruby 1.9 feststehen soll.

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 18 Jan 2007, 20:17 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Ich möchte das jetzt als Beispiel für die gewünschte Funktionalität in comp.lang.ruby als Change Proposal for Class 'Object' and 'Method' einbringen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Object
alias :_org_method :method
def method(name)
method_object = self._org_method(name)
method_object.object = self.object_id
method_object
end
end

class Method
attr_accessor :object
def method
md = self.to_s.match(/Method:\s*([^#]+)#([^>]+)>/)
return md[1], md[2]
end
end

# Now an example

class Hugo
def hi
puts "An instance of Hugo says 'Hi!'"
end
end

my_hugo = Hugo.new
puts my_hugo.object_id # => 22497820 (for example)
myhi = my_hugo.method(:hi)
myhi[] # => An instance of Hugo says 'Hi!'
puts myhi.object # => 22497820 (for example)
p myhi.method # => ["Hugo", "hi"]

Hat noch jemand einen Hinweis oder einen Verbesserungsvorschlag? - Die Methodennamen sind natürlich nur als Möglichkeit gewählt, es geht mir ausschliesslich um die Ergebnisse.

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 18 Jan 2007, 20:49 
Offline
Obfuscator

Registriert: 18 Feb 2004, 15:47
Beiträge: 560
Wohnort: Erkelenz (Ostlimburg)
Ich halte es für verwirrend, wenn Method-Objekte bei #method etwas völlig anderes tun als jedes andere Objekt. Logischer fände ich z.B. Method#name und Method#instance_id (für letzteres gibt es sicher noch einen besseren Namen).


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 19 Jan 2007, 18:16 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Ich habe jetzt einen Text in comp.lang.ruby verfasst. Die Methodennamen habe ich entsprechend geändert.
Zitat:
Minor Change Proposal for Classes 'Object' and 'Method'
_______________________________________________________


I would like to make a small change suggestion on the class 'Method' by which the method 'Object#method' is also affected.

Background:
___________

When creating a 'Method' object, it is not possible to receive the object identification of the object which uses the 'Object#method' method (see 'Example for Workaround' for details) by using some Method of class 'Method'.

It is useful for some applications to analyse later on which to which objects a method is bound in an object of class 'Method'. In addition, it is simply missing from my viewpoint, because it is an essential information (attribute) of an object of class 'Method'.

A minor wish is an additional method for class 'Method', which returns the contents of 'Method#to_s' as an Array containing two elements, the class-name and the method-name without the textual border of 'Method#to_s'. It is easier and less expensive to return this existing information by a method of class 'Method', than to use a regular expression later on to extract the information.

The method names used by here are only suggestions, since I needed names for the example. Regarding definite names I have no emotions.

___________


>>>>> Example for Workaround >>>>>
class Object
alias :_org_method :method
def method(name)
method_object = self._org_method(name)
method_object.instance_id = self.object_id
method_object
end
end

class Method
attr_accessor :instance_id
def method_name
md = self.to_s.match(/Method:\s*([^#]+)#([^>]+)>/)
return md[1], md[2]
end
end

# Now an example

class Hugo
def hi
puts "An instance of Hugo says 'Hi!'"
end
end

my_hugo = Hugo.new
puts my_hugo.object_id # => 22497820 (for example)
myhi = my_hugo.method(:hi)
myhi[] # => An instance of Hugo says 'Hi!'
puts myhi.instance_id # => 22497820 (for example)
p myhi.method_name # => ["Hugo", "hi"]
>>>>> End of Example >>>>>

___________


Please inform me, if this is not the right place for a change proposal.

Wolfgang Nádasi-Donner (WoNáDo)


>>>>> Edit >>>>>

Für singleton methods funktioniert das nicht, da das Format komplizierter ist. Da muss man mehr machen. Siehe auch comp.lang.ruby

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 20 Jan 2007, 17:28 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Nur kurz für all diejenigen, die nicht regelmässig in comp.lang.ruby nachsehen - der Änderungsvorschlag schon grösstenteils implementiert. Einige Kleinigkeiten stehen noch aus.

Wenn das abgeschlossen ist, schreibe ich hier noch das endgültige Ergebnis rein.

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 21 Feb 2007, 18:51 
Offline
Interpreter

Registriert: 15 Mär 2005, 19:26
Beiträge: 6142
Wohnort: Karlsruhe
Ich habe jetzt in http://eigenclass.org/hiki.rb?Changes+in+Ruby+1.9 gesehen, dass die Änderungen implementiert sind.
Zitat:
Method

Method#receiver
Returns the receiver of a Method object.


1
2
3
class A; def foo; end end
a = A.new
a.method(:foo).receiver # => #<A:0xa7c9f6d8>


Method#name
Returns the method name.

Method#owner
Returns the class or module where the method was defined.


1
2
3
class A; def foo; end end
a = A.new
a.method(:foo).owner # => A

_________________
WoNáDo.set_state!(:retired)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 21 Feb 2007, 22:41 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
ja, das geht schnell. unser Dir.exist? ist ja auch aufgenommen worden. wir sollten eine liste von änderungen machen, deren quelle rubyforen.de war.

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


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 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