[Note] [Débutant] Comment écrire Ruby Memo (refactoring) 1

Aperçu

J'ai remarqué que le code Ruby publié dans Dernier message n'est pas écrit à la manière de Ruby, j'ai donc également fait une note d'étude comme correction. abandonner.

Après avoir vu l'article suivant, j'ai essayé de le corriger en prenant le code de l'article précédent comme exemple tout en faisant référence au contenu à étudier. ** [Pour les débutants] Idiomes et méthodes utiles qui peuvent être utilisées pour la refactorisation dans Ruby and Rails | Qiita **

code

Avant correction

def Upcasing(result_lines)
  result_lines[0] = result_lines[0].capitalize
  break_flg = false
 ## ④ Notation de hachage en Ruby (sans modification: la raison pour laquelle cela n'a pas pu être fait sera décrite plus loin)
  break_sign = { "."=>true, "!"=>true, "?"=>true, ","=>false }

   result_lines.each_index do |i|
 ## ① Branche conditionnelle et valeur booléenne
    if break_flg == true
      result_lines[i] = result_lines[i].capitalize
    end

 ## ② Comment spécifier les éléments du tableau, reportez-vous au nombre spécifié dans la chaîne de caractères
    if break_sign[result_lines[i].slice(-1)] == true
      break_flg = true
    else
      break_flg = false
    end
  end
  joined_line = result_lines.join(" ")
 ## ③ Notation de la valeur de retour en Ruby
  return joined_line
end

print Upcasing(["oh,", "yeah!", "hello!"])

## Résultat d'exécution
 Oh, yeah! Hello!

point de changement

def Upcasing(result_lines)
  result_lines[0] = result_lines[0].capitalize
  break_flg = false
 ## ④ Notation de hachage dans Ruby (La raison pour laquelle elle ne peut pas être modifiée sans modification sera décrite plus loin)
  break_sign = { "."=>true, "!"=>true, "?"=>true, ","=>false }

   result_lines.each_index do |i|
 ## ① Branche conditionnelle et valeur booléenne
-   if break_flg == true
+   if break_flg
      result_lines[i] = result_lines[i].capitalize
    end

 ## ② Comment spécifier les éléments du tableau, reportez-vous au nombre spécifié dans la chaîne de caractères
-   if break_sign[result_lines[i].slice(-1)] == true
+   if break_sign[result_lines[i][-1]]   
      break_flg = true
    else
      break_flg = false
    end
  end
  joined_line = result_lines.join(" ")
 ## ③ Notation de la valeur de retour en Ruby
- return joined_line
end

print Upcasing(["oh,", "yeah!", "hello!"])

modifié

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
      result_lines[i] = result_lines[i].capitalize
    end
    
    if break_sign[result_lines[i][-1]]
      break_flg = true
    else
      break_flg = false
    end
  end
  joined_line = result_lines.join(" ")
end

print Upcasing(["oh,", "yeah!", "hello!"])

## Résultat d'exécution
 Oh, yeah! Hello!

Détails de chaque correction

Nous suivrons les points à examiner (1) à (4) dans l'ordre numérique.

① Branche conditionnelle et valeur booléenne

-   if break_flg == true
+   if break_flg

Structure de contrôle> if | Ruby 2.7.0 Manuel de référence

C'est embarrassant, mais j'en abusais à cause de l'inertie, et je ne comprenais pas la spécification fondamentale selon laquelle si une seule variable est décrite comme une expression, la vérité est renvoyée. Il ne s'agit pas seulement de Ruby ... Au moins, en Ruby, n'écrivez pas (== true) avec un simple jugement de vérité.

hoge = true
p hoge
if hoge; hoge = false; end
p hoge

 true
 false
var hoge = true;
console.log(hoge);
if (hoge) hoge = false;
console.log(hoge);

// true
// false
public class Hello{
  public static void Main(){
    bool hoge = true;
    System.Console.WriteLine(hoge);
    if (hoge){ hoge = false; }
    System.Console.WriteLine(hoge);
  }
}

// True
// False

(2) Comment spécifier les éléments du tableau, référence au nombre spécifié dans la chaîne de caractères

-   if break_sign[result_lines[i].slice(-1)] == true
+   if break_sign[result_lines[i][-1]]

③ Notation de la valeur de retour en Ruby

def Upcasing(result_lines)
  ##
 ## Code omis
  ##
  joined_line = result_lines.join(" ")
- return joined_line
end

④ Notation de hachage en Ruby

break_sign = { "."=>true, "!"=>true, "?"=>true, ","=>false }

Au début, j'ai essayé de modifier la notation en utilisant des symboles comme indiqué ci-dessous.

break_sign = { ".": true, "!": true, "?": true, ",": false }

Lorsque je l'ai changé comme ci-dessus, le résultat de débogage de la méthode supérieure a changé. Ainsi, lorsque j'ai vérifié le contenu du hachage, la clé "!" Stockée comme ci-dessous n'était plus une chaîne de caractères.

break_sign = { "."=>true, "!"=>true, "?"=>true, ","=>false }
p break_sign
=> {"."=>true, "!"=>true, "?"=>true, ","=>false}

break_sign = { ".": true, "!": true, "?": true, ",": false }
p break_sign
=>{:"."=>true, :!=>true, :"?"=>true, :","=>false}

J'ai pensé à l'exprimer en utilisant des symboles, mais je me demandais s'il y avait tant de scènes où un caractère spécial était appliqué à la clé de hachage en premier lieu, alors j'ai décidé de passer par cette fois. Si vous remarquez quelque chose à ce sujet, je le posterai séparément.

Recommended Posts

[Note] [Débutant] Comment écrire Ruby Memo (refactoring) 1
Écriture verticale rubis
Code d'écriture Ruby
Rédaction de mémo de démarrage de printemps (1)
notes de syntaxe de base ruby
Ce qui m'a impressionné en tant que débutant dans l'écriture de Ruby
Rédaction de mémos de démarrage de printemps (2)
Mémo personnel Progate Ruby I (2)
Mémo personnel Progate Ruby I (1)