2009-06-10 6 views
1

J'ai un constructeur pour un programme d'objet qui valide un argument pour vous assurer qu'il est un entier:Ruby est-elle? problèmes

def initialize(programid,*other_args) 
    unless programid.is_a?(Integer) then 
    raise TypeError 
    end 
    @programid = programid 
    @name = other_args['name'] 
end 

et quand je crée une nouvelle instance

my_prog = Program::new(13453) 

Il me donne cette erreur:

can't convert String into Integer (TypeError) 

qui ne devrait pas se passer parce que je ne suis pas essayer de faire une conversion. Des idées?

+0

Votre code fonctionne pour moi. Y a-t-il quelque chose d'autre qui est appelé lorsque vous appelez Program: new? Que se passe-t-il si vous avez mis programid.class avant votre moins? – DanSingerman

+0

Fonctionne bien pour moi aussi. Pouvez-vous poster un programme complet qui démontre l'erreur? – mikej

+1

Il s'avère que c'est lié à la façon dont j'utilise * other_args. Je pensais que je pourrais l'utiliser comme un hachage, mais il semble que je ne peux pas @name = other_args ['name'] –

Répondre

0
class Program 
    def initialize(*other_args) 
    programid = other_args.shift 
    other_args = other_args.first || {} 
    unless programid.is_a?(Integer) then 
     raise TypeError 
    end 
    @programid = programid 
    @name = other_args['name'] 
    puts @name 
    puts @programid 
    end 
end 
Program::new(13453) 
Program::new(13453,'name'=>"North Wolf") 
+0

Wow, c'est génial ! Merci! –

2

L'erreur n'est pas provoquée par is_a?

« ne peut convertir chaîne en entier (TypeError) » est causée par cette ligne:

@name = other_args['name'] 

other_args est un tableau dans votre exemple de code pas un hachage - c'est pourquoi Ruby tente de convertir « nom Si vous appelez une méthode avec la syntaxe de l'argument mot-clé, cela fonctionne comme si tous les mots-clés args étaient regroupés dans un hachage fourni comme dernier argument de l'appel de la méthode.

Notez la différence dans les déclarations de méthode:

vôtre:

def initialize(programid,*other_args) 

Subba Rao

def initialize(*other_args) 

C'est une simplification propre - transformer tous les arguments en un seul hachage, quart de travail le premier argument (que le code suppose que vous avez). Puis fournissez un hash vide par défaut comme alternative si vous n'avez pas fourni d'autres arguments:

other_args.first || {}