2010-11-26 3 views
0

Dies ist wahrscheinlich einfach zu tun! Ich kann mir die Schleife noch nicht vorstellen, ich habe über eine verschachtelte For-Schleife nachgedacht, bin mir aber nicht ganz sicher, wie ich zwischen den beiden Hashes wechseln soll.Wie verwende ich die for-Schleife in Ruby, um verschiedene Werte von Hash-Tabellen zu greifen

Lets sagen, dass ich eine Klasse mit einer def haben, die zwei Hash-Tabellen containts:

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 

Wie gehe ich über String Ausgabe auf dem Bildschirm wie diese Rückkehr:

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

oder einfach Brief position letter position ... Danke für die Hilfe, lege den Code hoch, damit ich meinen Editor anprobieren kann!

+0

Es ist sehr har d zu verstehen, was Sie versuchen zu tun. Was macht 'mein_array'? Es scheint nirgends in Ihrem Code verwendet zu werden. Das Gleiche gilt für 'array_size',' element_indexer' und 'array_start_index'. Woher kommt 'a_string'? Wozu werden 'Buchstaben' und' Position' verwendet? Sie werden auch nirgendwo benutzt! (Tatsächlich wird * keine * Ihrer Variablen irgendwo verwendet.) Wozu dient die Klasse 'Teststuff'? Es wird niemals instanziiert. Für was ist die Methode 'test_stuff'? Es wird nie aufgerufen. Können Sie Testfälle für die Ausgabe bereitstellen? –

+0

Im Moment gibt es keine Parameter, also wird die Ausgabe * immer * die gleiche sein, in diesem Fall könntest du genauso gut 'zurückgeben' ** A eins B zwei C drei C vier ** ''. Was mich daran erinnert: warum ist die Ausgabe "** A eins B zwei C drei C vier **" und nicht "** A eins B zwei C drei C drei **" oder "** A eins B zwei C drei D vier ** '? –

+0

Warum ist 'letters' ein' Hash' und kein 'Array' und warum verwenden' letters' und 'position'' 's'' für die Tasten anstelle von' Integer's oder umgekehrt, warum 'my_array' benutzt 'Integer's für die Werte und nicht' String's? Warum gibt es Leerzeichen um die Buchstaben in Buchstaben, aber nicht in der Ausgabe? Gleich für "Position"? –

Antwort

1

Ich glaube, ich herausgefunden, was es ist, Sie wollen, obwohl ich habe immer noch keine Ahnung, was array_size, element_indexer , array_start_index und TestStuff sind für.

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 

[nahm ich die Freiheit des Codes Standard Ruby-Codierung Stil Neuformatierung.]

Allerdings würde alles viel einfacher sein, wenn es nicht alle diese Typkonvertierungen waren, und all diese überflüssigen Räume . Auch würde das Verfahren viel nützlicher sein, wenn es tatsächlich einen Weg hat unterschiedliche Ergebnisse zurückgeben, statt immer die gleiche Sache zurückkehren, denn im Moment ist es eigentlich genau entspricht

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

etwas in diesem Linien würde viel mehr Sinn machen:

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**' 

Wenn Sie den Object Namespace mit Ihrer Methode verschmutzen nicht wollen, können Sie etwas tun könnte:

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 und .join haben es geschafft .... Ich kann nicht glauben, dass ich vergaß .join Dank Jorg – Matt

+0

+1 für die Zuweisung einer Methode auf ein Objekt, das selbst das Ergebnis eines Ausdrucks ist - das ist ein netter Trick. – zetetic

+0

@zetetic: Ich benutze das, wenn ich ein paar "Prozeduren" in einem einzigen Namespace zusammenfassen möchte. Viele Leute verwenden ein Modul mit nur Singleton-Methoden für diesen Fall, aber ich denke, Module sind für die Einbeziehung, nicht für die Bündelung Methoden. Wenn Sie möchten, dass ein Singleton-Objekt eine Reihe von lose verwandten Methoden enthält, warum nicht ein Singleton-Objekt verwenden? –

1

Sie können Aufzählungen verwenden, wie folgt aus:

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

Wie wäre:

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") 
} 
Verwandte Themen