2010-07-26 16 views
1

J'essaie d'accepter l'entrée de deux entiers, séparés par un espace: 3 5 et de le sauvegarder dans un tableau d'entiers. Je le fais 3 fois, mais j'ai du mal à convertir ceci en chaîne en entiers. Voici ma boucle:Ruby - problèmes avec l'entrée de l'utilisateur dans le tableau d'entiers

for i in 1..3 
    puts "What is point " + i.to_s + " ?" # asks for input 
    s.push gets.split(" ") 
end 

Ensuite, je veux avoir

if s[1][0] - s[0][0] = 0 
    blah blah blah 
end 

Le tableau s ressemble actuellement

------------ 
| "1" "2" | 
| "3" "4" | 
| "5" "6" | 
------------ 

Je veux qu'il ressemble

-------- 
| 1 2 | 
| 3 4 | 
| 5 6 | 
-------- 

J'ai essayé gets.split(" ").map { |s| s.to_i } et gets.split(" ").collect{|i| i.to_i} mais je me rends compte que je devrais demander à quelqu'un ici.

Je viens de commencer à apprendre Ruby, donc si vous ne me dérange pas une brève explication avec la solution, je voudrais vraiment l'apprécier :)

Merci!

Note: C'est à peu près le contraire de this question, et j'ai essayé d'utiliser .collect et .map après la boucle, qui ne fonctionnait toujours pas.

+0

Que * est * stocké dans 's'? Si vous utilisez une ancienne version de ruby, vous devriez essayer '' '' au lieu de 'push', ex:' s << gets.split ('') '. Votre code tel qu'il est fonctionne comme vous le souhaitez sur mon ordinateur. – Adrian

+0

Actuellement stocké est le tableau que je veux, mais stocké en tant que chaînes. J'utilise Ruby 1.9.1. (J'ai aussi édité la question originale) –

+1

J'utilise aussi 1.9.1, et votre code exact (avec 'gets.split (" ") .map {| s | s.to_i}' au lieu de simplement 'gets.split ("")) est en train de produire des tableaux d'entiers – Adrian

Répondre

2

D'accord, désolé, je viens de voir l'erreur. Je ne peux pas croire que j'ai raté ça.

Dans votre instruction if, vous utilisez = au lieu de ==. =attribue choses, et ==compare choses. Un programme de travail complet pourrait ressembler à ceci:

s = [] 
for i in 1..3 
    puts "What is point " + i.to_s + " ?" # asks for input 
    s.push gets.split(" ").map {|x| x.to_i } 
end 
if s[1][0] - s[0][0] == 0 # notice the '=='. 
    puts 'It worked!' 
end 
+0

J'ai corrigé ça après avoir posé la question, j'ai réalisé à quel point j'étais stupide. J'avais quelques «puts» entre les deux qui montraient l'échec cependant, donc l'erreur réelle était séparée de cela. Merci pour votre aide si! –

1

Votre réponse me semble bonne. Vous pouvez remplacer s.push par s < < (plus Rubyish) et il n'y a pas besoin d'argument de split. Bien que je sois un novice, je pense que la plupart des Rubyiests écriraient:

s < < gets.split.map {| x | x.to_i}

En outre, vous pouvez remplacer

met "Quel est le point" + i.to_s + "?"

avec

puts "Quel est le point # {i}?"

+0

Que signifie << signifier? Je ne savais pas que je pourrais laisser tomber l'argument sur la scission. Et puis il est logique que je puisse laisser tomber le .chomp trop –

+0

<< est l'opérateur d'ajout. Vous pouvez écrire, par exemple, dog = '' << 'ca' << 'nin' << 'e' => "canine" Note si a = 'ca' et b = 'neuf', c = a << b => "canine", mais aussi un => "canin", qui peut ne pas être ce que vous voulez. << fonctionne de manière similaire avec les tableaux: q = [] << 'rapide' << 'marron' << 'fox' => ["rapide", "marron", "fox"] –

+0

Oh ok. Merci, c'est vraiment bon à savoir! Si ce n'est pas ce que je veux, j'utiliserais plutôt '+'. Bon à savoir ces petites choses. –