(ruby 2.5.3)
Wenn Sie eine JavaScript-Wiederholungsanweisung drehen möchten, während Sie Änderungen an den Array-Elementen vornehmen
for (var i = 0; i < A.length; i++){
// Ausgelassen: Ändere den Wert von A [i] unter bestimmten Bedingungen
}
Wenn Sie in Ruby in der gleichen Atmosphäre reproduzieren möchten
A.each_index do |i|
## Ausgelassen: Ändern Sie unter bestimmten Bedingungen den Wert von A [i]
end
Ich werde schreiben.
Ich habe meinen in JavaScript geschriebenen privaten Code in Ruby umgeschrieben. Die folgende JavaScript-Funktion ist ein Teil davon. Wenn englische Teile in einem Array übergeben werden, wird der Wortanfang, der dem Satzanfang entspricht, durch das Symbol am Ende in Großbuchstaben geändert und kombiniert und ausgegeben.
function Upcasing(result_lines) {
result_lines[0] = result_lines[0].replace(/^[a-z]/, result_lines[0].charAt(0).toUpperCase() );
var break_flg = false;
const break_sign = { ".":true, "!":true, "?":true, ",":false };
for (var i = 0; i < result_lines.length; i++) {
if (break_flg === true) {
result_lines[i] = result_lines[i].replace(/^[a-z]/, result_lines[i].charAt(0).toUpperCase() );
}
if ( break_sign[result_lines[i].slice(-1)] === true) {
break_flg = true;
} else {
break_flg = false;
}
}
return result_lines.join(" ");
}
console.log(Upcasing(["oh,", "yeah!", "hello!"]));
// Ausführungsergebnis
// Oh, yeah! Hello!
// <= "Hallo!" Wird jetzt durch das vorherige "!"
Folgendes habe ich in die Ruby-Methode umgeschrieben (dachte ich).
def Upcasing(result_lines)
result_lines[0] = result_lines[0].capitalize
break_flg = false
break_sign = { "."=>true, "!"=>true, "?"=>true, ","=>false }
for r in result_lines
if break_flg == true
r = r.capitalize
end
if break_sign[r.slice(-1)] == true
break_flg = true
else
break_flg = false
end
end
joined_line = result_lines.join(" ")
return joined_line
end
print Upcasing(["oh,", "yeah!", "hello!"])
## Ausführungsergebnis
## Oh ja! Hallo! <= "H" in "Hallo!" Wird nicht groß geschrieben
Da das for expression` `keinen Bereich wie das` `each method
erstellt, kann das
r des` `for r in result_lines
außerhalb des Blocks verwendet werden, aber in erster Linie ist es das ursprüngliche Array-Element. Ist eine neu definierte Variable. Wenn Sie also Änderungen an Array-Elementen vornehmen möchten, müssen Sie results_lines [i]
sogar innerhalb des Blocks bearbeiten. (Diese Variable r
ist kein Blockparameter.)
Normalerweise gibt es beim Schreiben von Ruby-Code nicht viele Szenen, in denen Werte in sich wiederholenden Blöcken zugewiesen werden. Daher fehlt das Konzept temporärer Felder wie Blockparameter und die Erkennung des generierten Bereichs. Es war.
(* Das in diesem Memorandum verwendete ist Ruby 2.5.3.)
In der Form von "für Variablennamen in Arraynamen" wie im obigen Code ist der Index für die Angabe des Array-Elements im Block nicht in der Variablen definiert. Verwenden Sie daher die Methode "each_index" und verwenden Sie Folgendes Gewechselt zu. (Der folgende Code wurde in einem Artikel überarbeitet, der zu einem späteren Zeitpunkt veröffentlicht wurde.)
def Upcasing(result_lines)
result_lines[0] = result_lines[0].capitalize
break_flg = false
break_sign = { "."=>true, "!"=>true, "?"=>true, ","=>false }
result_lines.each_index do |i|
if break_flg == true
result_lines[i] = result_lines[i].capitalize
end
if break_sign[result_lines[i].slice(-1)] == true
break_flg = true
else
break_flg = false
end
end
joined_line = result_lines.join(" ")
return joined_line
end
print Upcasing(["oh,", "yeah!", "hello!"])
## Ausführungsergebnis
Oh, yeah! Hello!
(In diesem Fall gibt es keine Auswirkung auf das Ganze, da es nicht erforderlich ist, die im Wiederholungsblock außerhalb des Variablenblocks definierte Variable zu verwenden, je nachdem, ob der Bereich durch "für Ausdruck" oder "jede Methode" generiert wird. .)
Ich denke, dass das Weglassen des Variablennamens und das Reduzieren der Anzahl von Sätzen ein großer Vorteil der Verwendung des Blockparameters ist, aber wenn das relevante Array-Element im iterativen Prozess geändert wird, wird es möglicherweise nicht viel verwendet. Ich habe darüber nachgedacht, den Wert und den Index mit der Methode "each_with_index" an den Blockparameter zu übergeben und ihn nur in dem Teil zu verwenden, der sich auf das aktuelle Element bezieht, wie im folgenden Entwurf, aber ich bin der Meinung, dass Schreibfehler zunehmen können. Und blieb stehen. Der Variablenname lautet| r |Nicht| current_element |Es kann immer noch leicht zu verstehen sein.
result_lines.each_with_index do |current_element, i|
if break_flg == true
result_lines[i] = current_element.capitalize
end
if break_sign[current_element.slice(-1)] == true
break_flg = true
else
break_flg = false
end
end
Recommended Posts