2010-11-26 4 views
0

C'est probablement facile à faire! Je ne suis pas encore en mesure d'envisager la boucle, je pensais à une boucle imbriquée, mais je ne sais pas trop comment alterner entre les deux hachages.Comment utiliser la boucle for dans ruby ​​pour saisir des valeurs différentes des tables de hachage

Disons que j'ai une classe avec une définition qui containts deux tables de hachage:

class Teststuff 
    def test_stuff 
    letters = { "0" => " A ", "1" => " B ", "2" => " C " } 
    position = {"1" => "one ", "2"=> " two ", "3"=> " three ", "4"=>" four " } 

    my_array=[0,1,2,2] #this represents user input stored in an array valid to 4 elements 
    array_size = my_array.size #this represents the size of the user inputed array 
    element_indexer = my_array.size # parellel assignment so I can use same array for array in dex 
    array_start_index = element_indexer-1 #give me the ability later to get start at index zero for my array 

#for loop?? downto upto?? 
# trying to get loop to grab the first number "0" in element position "0", grab the hash values then 
# the loop repeats and grabs the second number "1" in element position "1" grab the hash values 
# the loop repeats and grabs the third number "2" in elements position "2" grab the hash values 
# the final iteration grabs the fourth number "2" in elements position "3" grab the hash values 
# all this gets returned when called. Out put from puts statement after grabing hash values 
# is: **A one B two C three C four** 

    return a_string 
    end 
    end 

Comment puis-je faire pour retourner la sortie de chaîne à l'écran comme ceci:

**A one B two C three C four** 

ou simplement lettre position de lettre de position ... Merci pour l'aide, mettre le code afin que je puisse essayer sur mon éditeur!

+0

Il est très har d comprendre ce que vous essayez de faire. Que fait 'my_array'? Il ne semble pas être utilisé dans votre code n'importe où. De même pour 'array_size',' element_indexer' et 'array_start_index'. D'où vient «a_string»? A quoi servent les lettres et la position? Ils ne sont utilisés nulle part non plus! (En fait, * aucune * de vos variables sont utilisées n'importe où.) A quoi sert la classe 'Teststuff'? Il n'est jamais instancié. A quoi sert la méthode 'test_stuff'? Il ne s'appelle jamais. Pouvez-vous fournir des testcases pour ce que la sortie devrait être? –

+0

Pour le moment, il n'y a pas de paramètres, donc la sortie sera * toujours * la même chose, auquel cas vous pourriez tout aussi bien faire 'return '** Un B deux C trois C quatre **' '. Ce qui me rappelle: pourquoi est la sortie «** un B deux C trois C quatre **» et non «** un B deux C trois C trois **» ou «** un B deux C trois D quatre ** '? –

+0

Aussi, pourquoi est-ce que 'letters' est un' Hash' et non un 'Array' et pourquoi' letters' et 'position' utilisent' String's pour les clés au lieu de 'Integer's ou l'inverse, pourquoi 'my_array' utilise' Integer's pour les valeurs, et pas 'String' s? Pourquoi y a-t-il des espaces autour des lettres en lettres, mais pas dans la sortie? Idem pour 'position'? –

Répondre

1

Je pense que je me suis dit ce que vous voulez, bien que je ne sais toujours pas ce que array_size, element_indexer , array_start_index et TestStuff sont pour.

def test_stuff 
    letters = { "0" => " A ", "1" => " B ", "2" => " C " } 
    position = {"1" => "one ", "2"=> " two ", "3"=> " three ", "4"=>" four " } 

    my_array = [0, 1, 2, 2] 

    "**#{my_array.map.with_index {|e, i| 
    "#{letters[e.to_s].strip} #{position[(i+1).to_s].strip}" 
    }.join(' ')}**" 
end 

[Je pris la liberté de reformater votre code style standard de codage Ruby.]

Cependant, tout serait beaucoup plus simple, il n'y avait pas toutes ces conversions de type, et tous les espaces superflus . En outre, la méthode serait beaucoup plus utile, si elle avait effectivement un moyen de renvoyer des résultats différents, au lieu de toujours retourner la même chose, parce qu'à l'heure actuelle, il est en fait exactement équivalent à

def test_stuff 
    '**A one B two C three C four**' 
end 

Quelque chose le long de ces lignes seraient beaucoup plus de sens:

def test_stuff(*args) 
    letters = %w[A B C] 
    position = %w[one two three four] 

    "**#{args.map.with_index {|e, i| "#{letters[e]} #{position[i]}" }.join(' ')}**" 
end 

test_stuff(0, 1, 2, 2) 
# => '**A one B two C three C four**' 

Si vous ne voulez pas polluer l'espace de noms Object avec votre méthode, vous pouvez faire quelque chose comme ceci:

def (TestStuff = Object.new).test_stuff(*args) 
    letters = %w[A B C] 
    position = %w[one two three four] 

    "**#{args.map.with_index {|e, i| "#{letters[e]} #{position[i]}" }.join(' ')}**" 
end 

TestStuff.test_stuff(0, 1, 2, 2) 
# => '**A one B two C three C four**' 
+0

.map et .join l'ont fait .... Je n'arrive pas à croire que j'ai oublié .join Merci Jorg – Matt

+0

+1 pour assigner une méthode à un objet qui est lui-même le résultat d'une expression - c'est une astuce. – zetetic

+0

@zetetic: J'utilise cela quand je veux regrouper quelques "procédures" ensemble dans un seul espace de noms. Beaucoup de gens utilisent un module avec seulement des méthodes singleton pour ce cas, mais je pense que les modules sont à inclure, pas pour les méthodes de regroupement. Si vous voulez qu'un objet singleton contienne un tas de méthodes vaguement liées, pourquoi ne pas utiliser un objet singleton? –

1

Vous pouvez utiliser les agents recenseurs, comme ceci:

l = letters.to_enum 
p = position.to_enum 
a_string = '' 
loop do 
    a_string << l.next[1] << p.next[1] 
end 
0

Que diriez-vous:

a_string = "" 
my_array.each_with_index { |x, index| 
    a_string += letters[my_array[index].to_s] + " " + (position.include?((index+1).to_s) ? position[(index+1).to_s] : "nil") 
} 
Questions connexes