[Note] [Débutant] Comment écrire lors de la modification de la valeur d'un élément de tableau dans une phrase répétée de Ruby

(ruby 2.5.3)

Conclusion

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.

Contexte

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 ''. .)

Impressions

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

Recommended Posts

[Note] [Débutant] Comment écrire lors de la modification de la valeur d'un élément de tableau dans une phrase répétée de Ruby
Comment récupérer la valeur de hachage dans un tableau dans Ruby
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
Comment changer une chaîne dans un tableau en un nombre dans Ruby
Comment spécifier un tableau pour la valeur de retour / l'argument d'une méthode dans le fichier IDL CORBA
[Java] Comment rechercher des valeurs dans un tableau (ou une liste) avec la méthode contains
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
[Swift] Comment obtenir le nombre d'éléments dans un tableau (super basique)
[Java] Comment convertir un élément d'un tableau de type String en type Int
Comment démarrer un indice à partir d'un nombre arbitraire dans le traitement itératif Ruby
Comment trouver la valeur totale, la valeur moyenne, etc. d'un tableau à deux dimensions (tableau multidimensionnel) -java
Comment écrire un exemple d'implémentation du problème dans E05 (ruby, C11) en temps réel hors ligne
Comment demander en passant un tableau à une requête avec le client HTTP de Ruby
[Ruby] Comment récupérer le contenu du double hachage
Comment ajouter les mêmes index dans un tableau imbriqué
[Ruby] Comment extraire une valeur spécifique d'un tableau sous plusieurs conditions [sélectionner / chacun]
[Ruby] Comment compter les nombres pairs ou impairs dans un tableau
[Swift5] Comment obtenir un tableau et un ensemble de différences entre les tableaux
Comment écrire Ruby en une seule ligne Résumé par débutant
Convertir un tableau de chaînes en une liste d'entiers en Java
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Comment obtenir la longueur d'un fichier audio avec Java
Comment incrémenter la valeur de Map sur une ligne en Java
Comment écrire lorsque vous voulez gérer un "tableau de chaînes en langage C" comme argv [] dans Ruby-FFI
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
Comment définir l'image pour dessiner à gauche / à droite du bouton à l'aide de la police d'icône (Iconics)
Comment trouver le nombre total de pages lors de la pagination en Java
Comment contraindre l'action de la destination de transition lorsqu'elle n'est pas connectée
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Développement Android, comment vérifier null dans la valeur de l'objet JSON
Comment référencer une colonne lors du remplacement de la méthode de nom de colonne dans ActiveRecord
Comment insérer un traitement avec n'importe quel nombre d'éléments dans le traitement itératif dans Ruby
Lors de la réaffectation à un argument dans une méthode Ruby puis en appelant `super` → Celui réaffecté est utilisé
graphql-ruby: Comment obtenir le nom de la requête ou de la mutation dans le contrôleur Remarque
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment vérifier si une variable d'instance est définie dans une classe Ruby
[Swift] Comment changer l'ordre des éléments de barre dans le contrôleur de barre d'onglets [Débutant]
Comment créer une combinaison unique de données dans la table intermédiaire des rails
J'ai fait un exemple de la façon d'écrire un délégué dans Swift UI 2.0 à l'aide de MapKit
Comment trouver la cause de l'erreur Ruby
[Rails] Comment écrire lors de la création d'une sous-requête
Comment écrire une instruction if pour améliorer la lisibilité-java
Comment créer la blockchain la plus simple de Ruby
Je veux obtenir la valeur en Ruby
[Java] Lors de la mise d'une chaîne de caractères dans le cas de l'instruction switch, il est nécessaire d'en faire une expression constante
Comparaison de vitesse lorsque le côté valeur de Hash veut tout récupérer avec un tableau