2008-09-17 9 views
0

(désolé, j'aurais été plus clair avec le code de la première fois que je posté. Espérons que cela a un sens)Pourquoi les modules n'honorent-ils pas toujours 'require' dans ruby?

Fichier "size_specification.rb"

class SizeSpecification 
    def fits?  
    end 
end 

Fichier "some_module.rb"

require 'size_specification' 

module SomeModule 
    def self.sizes 
    YAML.load_file(File.dirname(__FILE__) + '/size_specification_data.yml') 
    end 
end 

fichier « size_specification_data.yml

--- 
- !ruby/object:SizeSpecification 
    height: 250 
    width: 300 

Puis, quand je l'appelle

SomeModule.sizes.first.fits? 

je reçois une exception parce que « tailles » sont l'objet n'est pas SizeSpecification de sorte qu'ils ne sont pas une fonction « adapte ».

Répondre

0

En deuxième lecture, je suis un peu confus, vous semblez vouloir mélanger la classe en module, ce qui n'est peut-être pas conseillé. Le YAML est-il supposé charger un tableau des SizeSpecifications?

Il semble que vous ne mixiez pas le module dans votre classe. Si je lance le test dans irb alors le require lance une LoadError. Donc je suppose que vous avez mis deux fichiers ensemble, sinon le vider.

Normalement, vous devez écrire la fonctionnalité dans le module, puis la mélanger dans la classe. de sorte que vous pouvez modifier votre code comme ceci:

class SizeSpecification 
    include SomeModule 
    def fits?  
    end 
end 

Ce qui vous permettra de dire alors:

SizeSpecification::SomeModule.sizes 

Je pense que vous devriez aussi être en mesure de dire:

SizeSpecification.sizes 

Quoi qu'il en vous oblige à supprimer le préfixe de la définition de la méthode des tailles.

Cela aide-t-il?

1

Vos paramètres et votre installation de ruby ​​sont-ils corrects? J'ai créé ces 3 fichiers et j'ai écrit ce qui suit dans "test.rb"

require 'yaml' 
require "some_module" 

SomeModule.sizes.first.fits? 

Puis je l'ai couru.

$ ruby --version 
ruby 1.8.6 (2008-06-20 patchlevel 230) [i486-linux] 
$ ruby -w test.rb 
$ 

Pas d'erreur!

+0

Idem. Le code tel que posté fonctionne parfaitement bien pour moi. –

0

Le code de question m'a un peu confus.

En général avec Ruby, si cela arrive c'est un bon signe que j'essaie de faire les choses de la mauvaise façon.

Il serait peut-être préférable de poser une question liée à votre résultat réel plutôt qu'aux spécificités d'une «attaque» particulière à votre problème. On peut dire 'nonono, ne fais pas ça, fais CE' ou 'ahhhhh, maintenant je comprends ce que tu veux faire'