Forum: PC-Programmierung ruby 1.8: Merkwürdiger Fehler mit require


von Uhu U. (uhu)


Angehängte Dateien:

Lesenswert?

Beim Anfordern eines Moduls bekomme ich einen sehr merkwürdigen Fehler, 
wenn ich versuche, eine Methode aus dem Modul voll qualifiziert 
aufzurufen:
1
./module_test.rb:3: private method `test' called for TestModule:Module (NoMethodError)

Die Modul-Datei testmodule.rb sieht so aus:
1
module TestModule
2
   def test
3
      puts 'test'
4
   end
5
end
Das Testprogramm sieht so aus:
1
require 'testmodule'
2
#include TestModule
3
TestModule.test

Wenn ich die Zeile #include TestModule entkommentiere, ist der Fehler 
weg.

Ich benutze Ruby 1.8.7 p358. Kann sich jemand einen Reim darauf machen?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Eventuell gibt es noch einen anderes "TestModule" was da kollidiert?

von Uhu U. (uhu)


Lesenswert?

Ich habs mit verschiedenen Namen und auch vollständiger Pfadangabe bei 
require versucht - immer derselbe Mist.

Die einzige Variable bisher ist die Fehlermeldung selbst:

Dort, wo ich erstmals darüber gestolpert bin, meint Ruby,
  undefined method
während es in der Testumgebung
  private method called
heißt.

von Robert L. (lrlr)


Lesenswert?

> private method `test' called for TestModule:Module

da steht "private"

musst wohl public definieren.. (wie auch immer das geht)

von Uhu U. (uhu)


Lesenswert?

Robert L. schrieb:
> nachtrag: wobei es ausschaut als hättest du immer noch probleme mit
> "instancen und klassen"

Dafür, daß du nicht die Spur von einer Ahnung hast, nimmst du den Mund 
ganz schön voll...

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?

Hallo Uhu,

ändere die Methoden-Deklaration:
1
  def self.test
2
    puts 'test'
3
  end

Sollte dann eigentlich funktionieren - mit/ohne include

mfg

O. Brecht

von Uhu U. (uhu)


Lesenswert?

Olaf Brecht schrieb:
> ändere die Methoden-Deklaration:
>   def self.test
>     puts 'test'
>   end

Interessanter Vorschlag.

def self.test macht sowas ähnliches, wie eine Klassenmethode bei einer 
Klasse daraus. Nur was ist das genau? Eine Modul-Methode? Ein Modul hat 
doch keine Eigenklasse? Oder doch?

Was ist der Unterschied zwischen test2 und test2:
1
module Test
2
   def test1
3
   end
4
5
   def self.test2
6
   end
7
end

von D. I. (Gast)


Lesenswert?

Uhu Uhuhu schrieb:
> Ein Modul hat
> doch keine Eigenklasse? Oder doch?

Schlagmichtot, aber soweit ich weiß sind Module nicht instantiierbar und 
deswegen macht man die Methoden da drin statisch durch self.bla, so dass 
es dann klappt.

Warum verwendest du noch Ruby 1.8 statt 1.9 oder nun 2.0?

von Uhu U. (uhu)


Lesenswert?

D. I. schrieb:
> Schlagmichtot, aber soweit ich weiß sind Module nicht instantiierbar und
> deswegen macht man die Methoden da drin statisch durch self.bla, so dass
> es dann klappt.

Nach meinen Erfahrungen mit den @@-Variablen in Klassen halte ich es 
doch für wünschenswert, dahinter zu kommen, was da genau passiert.

Der Effekt, auf den dieser Thread zurück geht, scheint wohl ein Bug zu 
sein.

> Warum verwendest du noch Ruby 1.8 statt 1.9 oder nun 2.0?

Das ist der kleinste gemeinsame Nenner auf Ubuntu 10.04 LTS und 12.04 
LTS.

von D. I. (Gast)


Lesenswert?

Uhu Uhuhu schrieb:
>> Warum verwendest du noch Ruby 1.8 statt 1.9 oder nun 2.0?
>
> Das ist der kleinste gemeinsame Nenner auf Ubuntu 10.04 LTS und 12.04
> LTS.

Achso du verwendest kein rvm, oder?

von Uhu U. (uhu)


Lesenswert?

D. I. schrieb:
> Achso du verwendest kein rvm, oder?

Doch, aber das Skript soll auch auf einem "nackten" System laufen.

von Olaf B. (Firma: OBUP) (obrecht)


Lesenswert?


von Robert L. (lrlr)


Lesenswert?

Uhu Uhuhu schrieb:
> Dafür, daß du nicht die Spur von einer Ahnung hast, nimmst du den Mund
> ganz schön voll...

oha...


>Mehrfachvererbung: Mixins

>....

>module Foo
>
>  def bar
>    "bar"
>  end
>
>end

>puts Foo.bar #=> NoMethodError


>Das Problem ist hier offensichtlich, dass bar keine Modulmethode von Foo
>ist, sondern eine Instanzmethode.


ist witzig, obwohl ich tatsächlich keine ahnung hab von ruby...
war ich also mit meiner Vermutung, dass das (immer noch) dein 
Instanzen/Klassen "problem" ist, nicht ganz so weit entfernt...

von Uhu U. (uhu)


Lesenswert?

Olaf Brecht schrieb:
> schau bitte mal hier:
>   1. http://wiki.ruby-portal.de/Modul oder
>   2. http://www.ruby-doc.org/docs/ProgrammingRuby/html/...

Ok, man kann das Ganze mit irb/pry explorieren:
1
module M
2
   def self.m
3
     puts 'm'
4
   end  
5
   def mm
6
     puts 'mm'
7
   end  
8
end
9
10
M.instance_methods
11
=> ["mm"]
12
M.singleton_methods
13
=> ["m"]

Die Singleton-Methoden nutzen den Modul als Namespace,
die Instanz-Methoden - weil Module nicht instantiiert werden können - 
können nur in ein anderes Objekt eingemischt werden.

Sind die Instanz-Methoden ungebundene Methoden, ähnlich wie sie 
Method::unbind liefert?
1
"test".method(:inspect).unbind
2
=> #<UnboundMethod: String#inspect>
3
String.method(:inspect).unbind
4
=> #<UnboundMethod: Class(Kernel)#inspect>

von Uhu U. (uhu)


Lesenswert?

Ok, die Instanz-Methoden in einem Modul muß man sich als "Sack von 
UnboundMethods" vorstellen:
1
M.instance_method(:mm)
2
=> #<UnboundMethod: M#mm>

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.