ruby 1.8: Merkwürdiger Fehler mit require

OP #3070580
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?
Angehängte Dateien:
OP #3070614
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.
OP #3071330
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
Gast #3071341
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?
OP #3071352
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.
#3071711
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...
OP #3072135
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>

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.