[RUBY] Le trait de soulignement ActiveSupport n'est pas la conversion inverse de camelize

Lorsque vous utilisez un mot composé de plusieurs mots dans un identificateur, vous ne pouvez pas inclure d'espaces, vous devez donc en quelque sorte représenter un délimiteur de mot. Par exemple, la notation suivante est utilisée.

ActiveSupport fournit un ensemble de méthodes utiles pour convertir entre celles-ci.

Vous pouvez utiliser String # underscore pour convertir CamelCase en snake_case. Vous pouvez utiliser String # camelize pour convertir snake_case en UpperCamelCase [^ lcc].

[^ lcc]: Utilisez camelize (: lower) pour convertir en lowerCamelCase.

Comme ci-dessous:

require "active_support/inflector"

p "BookTitle".underscore # => "book_title"
p "book_title".camelize  # => "BookTitle"

En regardant cela, ʻunderscore et camelize` sont des conversions inverses l'une de l'autre.

require "active_support/inflector"

p "BookTitle".underscore.camelize  # => "BookTitle"
p "book_title".camelize.underscore # => "book_title"

Il semble (toujours) revenir à l'original lorsque les deux se chevauchent comme.

Cependant, dans certains cas, ce n'est pas le cas. C'est

require "active_support/inflector"

p "OfficialURL".underscore # => "official_url"
p "CSVFile".underscore     # => "csv_file"

Il s'agit d'un cas qui contient des mots composés uniquement de lettres majuscules, telles que ʻURLetCSV. La méthode ʻunderscore divise CSVFile en CSV et File en un snake_case, comme les humains s'y attendraient. Cependant, cela perd les informations selon lesquelles les «url» et «csv» convertis étaient à l'origine épelés en majuscules uniquement, donc «camelize» ne les restaurera pas.

require "active_support/inflector"

p "OfficialURL".underscore.camelize # => "OfficialUrl"
p "CSVFile".underscore.camelize     # => "CsvFile"

C'était un exemple qu'une méthode pratique pouvait tomber dans un piège si les spécifications ne sont pas bien comprises et utilisées. (Un jour, j'étais accro à [^ ot], en fait!)

[^ ot]: Au départ, je l'ai transformé en un snake_case avec un code comme gsub (/. (? = [AZ]) /) {$ & +" _ "} .downcase, puis j'ai mélangé le traitement en utilisant ActiveSupport. Parfois, quelque chose a mal tourné.

Recommended Posts

Le trait de soulignement ActiveSupport n'est pas la conversion inverse de camelize
L'idée de couper quand l'erreur n'est pas résolue
[Rails] Lorsque le changement de disposition du dispositif n'est pas reflété
'% 02d' Quel est le% de% 2?
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
Quelle est la structure des données d'ActionText?
Est-il courant de ne pas écrire la balise de fermeture de la balise <P> dans Javadoc?
[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)
Qu'est-ce que JSP? ~ Connaissons les bases de JSP !! ~
L'ordre des modificateurs de méthode Java est fixe
Le message d'erreur du périphérique ne s'affiche pas correctement.
La clé publique pour jenkins-2.249.1-1.1.noarch.rpm n'est pas installée
Le nom officiel de Spring MVC est Spring Web MVC
Lorsque le projet n'est pas affiché dans eclipse
Ebean.update () n'est pas exécuté dans le modèle hérité.
L'essence de l'humeur d'AspectJ - pourquoi votre `@ Transactional` est ignoré
Quand le survol d'Eclipse est difficile à voir
Dans Time.strptime,% j (date totale de l'année) est
DrainTo de LinkedBlockingQueue est-il sûr? J'ai suivi la source
La comparaison d'énumération est ==, et equals est bonne [Java]
N'arrondissez pas facilement le résultat d'un calcul fractionnaire
[JUnit 5] Traiter de "la référence d'assertEquals est ambiguë"
La question de savoir quel est le meilleur, si ou changer
Lorsque le mois de la date est acquis, le quart de janvier
[Swift] C'est la solution! Illustration de la mise en œuvre du délégué
PATH ne passe pas ... La cause est le code du caractère
[Erreur] L'application ne s'affiche pas dans l'environnement de production
Comment la valeur suivante de l'objet Time est-elle correcte?
Lors de la réécriture du CMD de l'image docker de Pod dans le manifeste de k8s, n'utilisez pas la commande
Même si j'écris le paramètre de STRICT_QUOTE_ESCAPING dans CATALINA_OPTS dans tomcat8.5, il n'est pas reflété.