(ruby 2.5.3)
Lorsque vous souhaitez faire pivoter une instruction de répétition JavaScript tout en apportant des modifications aux éléments du tableau
for (var i = 0; i < A.length; i++){
// Omis: modifie la valeur de A [i] sous certaines conditions
}
Si vous souhaitez reproduire en Ruby dans la même ambiance
A.each_index do |i|
## Omis: modifiez la valeur de A [i] sous certaines conditions
end
J'écrirai.
J'étais en train de réécrire mon code privé écrit en JavaScript dans Ruby. La fonction JavaScript suivante en fait partie, et lorsque des parties anglaises sont passées dans un tableau, le début du mot correspondant au début de la phrase est changé en majuscule par le symbole à la fin et combiné et sorti.
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!"]));
// Résultat de l'exécution
// Oh, yeah! Hello!
// <= Qu'est-ce que "bonjour!" Est en majuscule au début du mot suivant en raison du précédent "!"
Ce qui suit est ce que j'ai réécrit (j'ai pensé) à la méthode Ruby telle qu'elle est.
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!"])
## Résultat d'exécution
## Oh, ouais! Bonjour! <= "H" dans "bonjour!" N'est pas en majuscule
Puisque l'expression for '' ne crée pas une portée comme la méthode ```each
, le r
du for r in result_lines
peut être utilisé en dehors du bloc, mais en premier lieu, c'est l'élément original du tableau. Est une variable nouvellement définie, donc si vous voulez apporter des modifications aux éléments du tableau, vous devez manipuler results_lines [i] '' même dans le bloc. (Cette variable
r`` n'est pas un paramètre de bloc.)
Habituellement, lors de l'écriture de code Ruby, il n'y a pas beaucoup de scènes où des valeurs sont attribuées dans des blocs répétitifs, de sorte que le concept de boîtes temporaires telles que les paramètres de bloc et la reconnaissance de la portée générée font défaut. C'était.
(* Celui utilisé dans ce mémorandum est ruby 2.5.3.)
Sous la forme de pour le nom de la variable dans le nom du tableau
comme le code ci-dessus, l'index pour spécifier l'élément du tableau dans le bloc n'est pas défini dans la variable, utilisez donc la méthode `ʻeach_index`` pour utiliser ce qui suit Changé en.
(Le code ci-dessous a été remanié dans un article publié ultérieurement.)
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!"])
## Résultat d'exécution
Oh, yeah! Hello!
(Pour cette fois, comme il n'est pas nécessaire d'utiliser la variable définie dans le bloc répétitif en dehors de celui-ci, il n'y a pas d'effet sur l'ensemble selon que la portée est générée par `` for expression '' ou ```each method ''. .)
Je pense qu'omettre le nom de la variable et réduire le nombre de phrases est un gros avantage de l'utilisation du paramètre block, mais si l'élément de tableau pertinent est modifié dans le processus itératif, il peut ne pas être beaucoup utilisé.
J'ai pensé à passer la valeur et l'index au paramètre de bloc avec la méthode ʻeach_with_index
comme indiqué dans le brouillon ci-dessous et à ne l'utiliser que dans la partie qui fait référence à l'élément actuel, mais je pense que les erreurs d'écriture peuvent augmenter. Et arrêté.
Le nom de la variable est| r |ne pas| current_element |Cela peut encore être facile à comprendre.
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