[RUBY] Plus utilisable Enumerable pour les débutants

introduction

Dans cet article, j'écrirai sur beaucoup de choses liées à Enumerable que je souligne souvent que je fais en fait des avis de demande de tirage dans les affaires. Toutes les méthodes ne sont pas couvertes, alors n'ayez pas peur. Cliquez ici pour la version anglaise

Qu'est-ce que Enumerable?

Mix-in pour la répétition des cours. Toutes les méthodes de ce module sont définies en utilisant chacune, donc chacune doit être définie dans la classe incluse.

https://docs.ruby-lang.org/ja/latest/class/Enumerable.html ... Apparemment ... En d'autres termes, les classes qui utilisent normalement chacune (par exemple Array, Hash, String) incluent ce module Enumerable.

Si vous trouvez chacun, utilisez-le

Si vous trouvez chaque processus, vous pouvez faire de même sans utiliser chacun d'eux. Arrêtons-nous et cherchons un moyen d'appeler sans utiliser chacun. En outre, selon ce que vous voulez faire, il peut être plus propre d'utiliser une autre méthode Enumerable.

Pratique énumérable

Mis à part les choses difficiles, jetons un coup d'œil aux choses que je souligne souvent. Pour les affaires, essayez de donner un sens aux variables.

Case 1: select

Before

arr = [1, 2, 3, 4, 5]
new_arr = []
arr.each do |v|
  new_arr << v if v.odd?
end

p new_arr # => [1, 3, 5]

After

new_arr = arr.select(&:odd?)

p new_arr # => [1, 3, 5]

Case 2: map

Before

arr = [1, 2, 3, 4, 5]
new_arr = []
arr.each do |v|
  new_arr << v * 2
end

p new_arr # => [2, 4, 6, 8, 10]

After

new_arr = arr.map { |v| v * 2 }

p new_arr # => [2, 4, 6, 8, 10]

Case 3: inject

Before

arr = [1, 2, 3, 4, 5]
sum = 0
arr.each do |v|
  sum += v
end

p sum # => 15

After

arr = [1, 2, 3, 4, 5]
sum = arr.inject(:+)

p sum # => 15

Case 4: any?

supposition

Le statut de réservation est défini comme suit. Je veux valider si le changement de statut est correct

booking_statuses = {
  pending: 0,
  payment_requested: 1,
  paid: 2,
  cancelled: 3
}

Before


def validate_booking_transition(passed_status)
  if passed_status == booking_statuses[:cancelled]
    allowed = [
      booking_statuses[:pending],
      booking_statuses[:payment_requested],
      booking_statuses[:paid]
    ].include?(passed_status)
  elsif ...
  .
  .
  .
end

After

def validate_booking_transition(passed_status)
  if passed_status == booking_statuses[:cancelled]
    allowed = %i(pending payment_requested paid).any? do |v|
      passed_status == booking_statuses[v]
    end
  elsif ...
  .
  .
  .
end

Case 5: group_by

Before

arr = [{code: 'a', val: 1}, {code: 'a', val: 2}, {code: 'b', val: 3}, {code: 'b', val: 4}]
new_hash = {}
arr.each do |hash|
  k = hash[:code]
  new_hash[k] = [] if new_hash[k].nil?

  new_hash[k] << hash[:val]
end

p new_hash #=> {"a"=>[1, 2], "b"=>[3, 4]}

After

new_hash = arr.group_by { |h| h[:code] }.transform_values { |grouped_arr| grouped_arr.map { |h| h[:val] } }

p new_hash #=> {"a"=>[1, 2], "b"=>[3, 4]}

Considération

Considérons chacun un peu. Pour les cas 1 à 3, c'est un modèle que le traitement et les méthodes pratiques qui sont souvent effectuées dans chacun sont utilisés. C'est presque une introduction à Enumerable. Le cas 4 concerne la manière d'utiliser Enumerable, et il existe un modèle qui rend les choses redondantes plus concises en utilisant différentes méthodes Enumerable en fonction de ce que vous voulez faire. (Un petit élément de logique métier est ajouté pour rendre l'image plus facile) Et le cas 5? À cet égard, passez simplement une ligne et sentez-vous rafraîchi! J'en ai envie, mais je pense que c'est difficile à comprendre. Si vous regardez de plus près, dans les cas 1 à 4, mettez-le dans le processus itératif,

En faisant une chose comme ça, dans le cas 5

Si vous regardez de plus près, vous exécutez plus de cartes dans le bloc transform_values. À première vue, cela semble simple à écrire et vous avez créé une double boucle. Si vous avez besoin de faire plusieurs choses en une seule itération comme celle-ci, leur utilisation peut être plus facile à comprendre et peut avoir un avantage en termes de vitesse de traitement.

Quels sont les avantages d'utiliser correctement la méthode Enumerable?

Je pense que l'index le plus important pour écrire du code dans de nombreux sites de développement est la lisibilité et la facilité de maintenance. Bien que chaque méthode soit utile, elle n'a pas de sens en soi (il s'agit essentiellement d'une boucle), il est donc parfois possible que le lecteur ne sache pas ce que le rédacteur de code a voulu. Une utilisation correcte de la méthode Enumerable clarifiera l'intention de l'écrivain et facilitera les futurs changements de code. D'un point de vue autre que la lisibilité, je pense que vous pourrez être plus clairement conscient des effets et des effets secondaires. Cependant, cela semble long, je vais donc l'omettre ici. Toutefois, comme illustré dans le cas 5, il peut y avoir un modèle qu'il est préférable d'utiliser chacun (surtout si vous utilisez la méthode Enumerable dans la méthode Enumerable), alors soyez prudent. Faisons le.

À la fin

Qu'est-ce que tu penses. Cette fois, j'ai brièvement expliqué la méthode Enumerable avec un exemple. Habitons-nous et écrivons le code plus confortablement;)

Recommended Posts

Plus utilisable Enumerable pour les débutants
Exécution de débogage Java [pour les débutants Java]
[Java] Instruction de base pour les débutants
[Pour les super débutants] Super introduction à DBUnit
(Pour les débutants) [Rails] Installer Devise
[Pour les super débutants] Ant super introduction
Java pour les débutants, masquage des données
[Pour les super débutants] Super introduction à Maven
Application Java pour les débutants: stream
Mémorandum d'arbre de bisection pour les débutants (1)
[Pour les débutants] Résumé du constructeur java
Les débutants jouent à des jeux Janken en Java
Construction d'environnement avec Docker pour les débutants
Java pour les débutants, les expressions et les opérateurs 1
[Pour les débutants] Exécutez Selenium sur Java
Liens pour créer des applications Android (pour les débutants)
Java pour les débutants, les expressions et les opérateurs 2
[Folio LSP] Roughly Docker (pour les débutants)
[Pour les super débutants] Struts2 Super Primer - Édition 2018
Cours orienté objet pour débutants envoyé par des débutants
Démarrer heroku via heroku CLI (pour les débutants)
Méthode d'apprentissage recommandée pour les débutants en programmation
[Pour les débutants en Java] À propos de la gestion des exceptions
Classes et instances Java pour les débutants