(3)
est une expression, pas une chaîne; il évalue à nombre3
.
'3'
est un littéral de chaîne, il n'évalue aucun nombre, mais peut être converti en to_i
. Les règles sont quite simple:
retour le résultat de l'interprétation des caractères principaux dans str comme une base de base entier (entre 2 et 36). Les caractères externes dépassant la fin d'un nombre valide sont ignorés. S'il n'y a pas de nombre valide à , le début de str, 0 est renvoyé. Cette méthode ne déclenche jamais d'exception lorsque la base est valide.
'(3)'
est un autre littéral de chaîne, encore une fois il n'évalue à aucun nombre par lui-même. Le problème est que vous ne serez pas en mesure de faire comprendre à l'analyseur que (
au début de cette chaîne particulière doit être traitée comme un séparateur - et essentiellement ignoré. Ce n'est pas comme ça que ça fonctionne.
Une solution possible est de remplacer le symbole (
au début de la chaîne avec sub
(comme suivi des symboles non-chiffres sont ignorés par to_i
):
'(3)'.sub(/^\(/, '').to_i => 3
Mais je me demande vraiment pourquoi obtenez-vous la parenthèse en premier lieu ici.
Nous vous remercions de explication exhaustive. (J'avoue que je pourrais regarder à la documentation, je pensais que to_i gère les chaînes comme ça). L'utilisation de parenthèses est juste un problème esthétique, pas grave. – optimista