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  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: super() ohne Argumente
BeitragVerfasst: 27 Nov 2006, 18:39 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Hi,

ich habe jetzt mehrfach den Hinweis gefunden das super ohne Argumente einfach alle Parameter übergibt die der Kindklasse bzw. deren Funktion übergeben wurden. Ich habe aber keinen Hinweis gefunden wie ich super nun ohne Parameter aufrufe.
Mein Problem: Ich habe eine Ruby Klasse in C geschrieben, ihre initialize Methode nimmt keine Parameter entgegen. Nun habe ich eine Kindklasse abgeleitet die Parameter übernehmen soll, wenn ich jetzt super() aufrufe bekomme ich einen "ArgumentError". Gibt es eine Weg das zu handhaben ?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 27 Nov 2006, 19:06 
Offline
ri
Benutzeravatar

Registriert: 02 Jun 2006, 23:18
Beiträge: 702
Hallo,



1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo
def initialize
print "foo"
end
end

class Bar < Foo
def initialize(a, b)
super() # Klammern nicht vergessen!
print "bar"
end
end

Bar.new(1, 2) # => foobar


Grüße,
Matthias


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 27 Nov 2006, 19:25 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Das ist eigenartig, so wie du es in deinem Beispiel gemacht hast hatte ich es auch versucht. Dein Beispiel Funktioniert, aber in meiner Variante funktioniert das nicht.
Mir ist aber gerade aufgefallen das ich die Fehlermeldung bezüglich der Methode "new" bekomme.
In meiner C-Klasse gibt es eine "new" und eine "initialize" Methode, allerdings ist mir der Unterschied nicht ganz klar.
Ich weiß mir gerade nicht zu helfen, gibt es noch Ideen ?


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 27 Nov 2006, 20:09 
Offline
Interpreter
Benutzeravatar

Registriert: 05 Jun 2005, 01:54
Beiträge: 3225
beyama hat geschrieben:
Mir ist aber gerade aufgefallen das ich die Fehlermeldung bezüglich der Methode "new" bekomme.
Kannst du mal die genaue Fehlermeldung posten?

_________________


1
2
3
alias L lambda
p L{|y|L{|f|y[L{|x|f[f][x]}]}[L{|f|y[L{|x|f[f][x]}]}]}[L{|z|L{|l|l.empty?? 0:1+z[l.drop(1)]}}][%w<a b c d e f g h i j>]
#=>10


Nuclear Powered Soup | Nuclear Powered Blog


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 27 Nov 2006, 20:25 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
beyama hat geschrieben:
In meiner C-Klasse gibt es eine "new" und eine "initialize" Methode, allerdings ist mir der Unterschied nicht ganz klar.
new ist eine methode der klasse, die man normalerweise nicht überschreibt. sie initialisiert eine neue instanz und ruft dann deren methode initialize auf.

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


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 28 Nov 2006, 09:14 
Offline
Rubyist

Registriert: 26 Apr 2006, 21:35
Beiträge: 366
Hi,

du siehst ja auch schon in deinem c-code einen unterschied.
Die new-methode solltest du mittels rb_define_singleton_method registriert haben.
Es ist also eine singletonmethode. Initialize wird, wie murphy schon sagte, dann
innerhalb von new mittel rb_obj_call_init() aufgerufen.

Zeig doch bitte mal die genaue fehlermeldung. Es ist zwar nicht schön, aber wenn
alles nix hilft, dann könntest du die init-methode der c-klasse einfach beliebig viele
optionale parameter annehmen lassen. Dazu musst du das flag -1 als letzten parameter
für rb_define_method verwenden und dein funktionsprototyp würde dann so aussehen.



1
2

static VALUE your_init(int argc,VALUE *argv,VALUE yourclass);


HTH

_________________



 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: 28 Nov 2006, 11:32 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Hallo,

danke für die Antworten. Also ich habe nicht die "new" Methode versucht zu überschreiben, sondern die "initialize" die Fehlermeldung sieht so aus:

irb(main):001:0> require "powermate"
=> true
irb(main):002:0> bla = Powermate.new "/dev/input/event3"
ArgumentError: wrong number of arguments (1 for 0)
from (irb):2:in `new'
from (irb):2

Mir war nur aufgefallen das sich der fehler auf "new" bezog. Es ist aber schon so das in meiner C-Klasse "new" als singelton definiert ist und es "initialize" aufruft, dabei besorgt "new" den Speicher für ein C struct und bindet es mit Data_Wrap_Struct an die Ruby Klasse, allerdings ist mir nicht ganz klar was das mit dem "singelton" soll, aber das ist wohl eine andere Frage.

Ein ausschnit aus der Klasse:



1
2
3
4
5
6
7
8
9
10
11
12
class Powermate < Evdev::Evdev
def initialize(path = false)
super()
@path = path
@valid_prefix = ["Griffin PowerMate", "Griffin SoundKnob"]
@blinking = false;
@pulse_asleep = 0
@pulse_awake = 0
open @path if @path
end
...
end

Die Klasse "Evdev" ist von der C-Klasse abgeleitet sie alleine macht keine Probleme.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 29 Nov 2006, 23:57 
Offline
Geselle

Registriert: 02 Nov 2006, 17:55
Beiträge: 103
Wohnort: Erfurt
Problem gelöst

Es funktioniert seit dem ich




rb_define_singleton_method(rb_cCevdev, "new", ruby_new, 0);

durch



rb_define_alloc_func(rb_cCevdev, ruby_new);

ersetzt habe.

Die Funktion existiert wohl erst seit Ruby 1.8, das liegt aber vor meiner Rubyzeit ich habe keine Ahnung ob die Versionen davor noch Relevanz haben, aber egal.

Vielen Dank an alle die geholfen haben.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 00:27 
Offline
Böser Admin 2
Benutzeravatar

Registriert: 17 Mär 2004, 17:03
Beiträge: 2544
Wohnort: Berlin
und das ist nirgends dokumentiert?

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


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 30 Nov 2006, 09:07 
Offline
Rubyist

Registriert: 26 Apr 2006, 21:35
Beiträge: 366
murphy hat geschrieben:
und das ist nirgends dokumentiert?


Da fragst du noch ? ;)

Ich bin sicher dass es irgendwo steht, aber wahrscheinlich auf japanisch oder
irgendwo vergraben in den tiefen des www.

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