En remarque, si vous êtes dans Rails, vous pouvez simplement le faire'Smith'.first
Walking Wiki
Ruby 1.9+ a"Smith".chr #=> "S"
Tyler James Young
Réponses:
128
Vous pouvez utiliser les classes ouvertes de Ruby pour rendre votre code beaucoup plus lisible. Par exemple, ceci:
classStringdef initial
self[0,1]endend
vous permettra d'utiliser la initialméthode sur n'importe quelle chaîne. Donc, si vous avez les variables suivantes:
last_name ="Smith"
first_name ="John"
Ensuite, vous pouvez obtenir les initiales de manière très claire et lisible:
puts first_name.initial # prints J
puts last_name.initial # prints S
L'autre méthode mentionnée ici ne fonctionne pas sur Ruby 1.8 (pas que vous ne devriez plus utiliser 1.8 de toute façon! - mais lorsque cette réponse a été publiée, c'était encore assez courant):
puts 'Smith'[0]# prints 83
Bien sûr, si vous ne le faites pas régulièrement, définir la méthode peut être exagéré et vous pouvez le faire directement:
notez que cela ne fonctionne que dans ruby19. dans ruby18 "Smith"[0]renverrait la valeur entière du caractère «S». Les deux versions obéissent "Smith"[0,1] == "S".
rampion
@rampion: Bien sûr, mais il n'y a aucune indication dans la question que l'OP n'utilise pas la version la plus récente, alors pourquoi se compliquer les choses?
Jörg W Mittag
4
Ruby 1.8 n'est pas un héritage! La ligne Ruby 1.8 est toujours prise en charge et une version 1.8.8 sera probablement publiée. De plus, ni JRuby ni Rubinius ne supportent encore la version 1.9. Je parierais 5 $ qu'il y a aujourd'hui beaucoup plus d'utilisateurs de 1,8 que de 1,9.
Marc-André Lafortune
3
@ Jörg: La réponse "Smith"[0,1]fonctionne sur 1.8 (en supposant ASCII). Je ne sais pas pourquoi vous en pensez autant sur le demandeur, ainsi que sur tous les autres qui aimeraient apprendre de cette question. Par exemple, Mac OS X est livré avec Ruby 1.8, donc aucune installation n'est requise pour ces utilisateurs.
Marc-André Lafortune
3
Comment obtiendriez-vous l'initiale du nom «Ångström» (en UTF-8) pour qu'il fonctionne comme prévu dans Ruby 1.8.x et 1.9.x? Aucune des méthodes suggérées ne fonctionnerait dans 1.8.x.
Lars Haugseth
30
"Smith"[0..0]
fonctionne à la fois en rubis 1.8 et en rubis 1.9.
notez que cela ne fonctionne que dans ruby19. dans ruby18 "Smith"[0]renverrait la valeur entière du caractère «S». Les deux versions obéissent "Smith"[0,1] == "S".
rampion
1
@rampion: en effet. J'ajouterais que "Smith"[0] == ?Sc'est vrai sur Ruby 1.8 et 1.9
Marc-André Lafortune
2
En raison d'un choix de conception ennuyeux dans Ruby avant la version 1.9 - some_string[0]retourne le code de caractère du premier caractère - la façon la plus portable d'écrire ceci est some_string[0,1], qui lui dit d'obtenir une sous-chaîne à l'index 0 de 1 caractère.
str [0,1] ne fonctionne pas non plus de la même manière dans 1.8 et 1.9, car dans le premier, il renvoie le premier octet tandis que dans le second, il renvoie le premier caractère .
Lars Haugseth
1
Ce n'est pas vraiment une différence dans la façon dont l'indexation fonctionne autant que dans le support de 1.9 pour les langages multi-octets. Ils sont tous deux destinés à renvoyer le premier caractère, mais la 1.8 a une vision plus naïve de ce qu'est un «personnage».
Chuck
2
Une autre option qui n'a pas encore été mentionnée:
Aucune de ces méthodes ne fonctionnera avec cela .après name. Et le dernier est insensé même si vous supprimez le ., car il utilise deux méthodes différentes pour faire la même chose - [0]etchr() .
'Smith'.first
"Smith".chr #=> "S"
Réponses:
Vous pouvez utiliser les classes ouvertes de Ruby pour rendre votre code beaucoup plus lisible. Par exemple, ceci:
vous permettra d'utiliser la
initial
méthode sur n'importe quelle chaîne. Donc, si vous avez les variables suivantes:Ensuite, vous pouvez obtenir les initiales de manière très claire et lisible:
L'autre méthode mentionnée ici ne fonctionne pas sur Ruby 1.8 (pas que vous ne devriez plus utiliser 1.8 de toute façon! - mais lorsque cette réponse a été publiée, c'était encore assez courant):
Bien sûr, si vous ne le faites pas régulièrement, définir la méthode peut être exagéré et vous pouvez le faire directement:
la source
Si vous utilisez une version récente de Ruby (1.9.0 ou ultérieure), les éléments suivants devraient fonctionner:
Si vous utilisez 1.9.0+ ou 1.8.7, les éléments suivants devraient fonctionner:
Si vous utilisez une version antérieure à la 1.8.7, cela devrait fonctionner:
Notez que
'Smith'[0,1]
cela ne fonctionne pas sur 1.8, il ne vous donnera pas le premier caractère, il ne vous donnera que le premier octet .la source
"Smith"[0]
renverrait la valeur entière du caractère «S». Les deux versions obéissent"Smith"[0,1] == "S"
."Smith"[0,1]
fonctionne sur 1.8 (en supposant ASCII). Je ne sais pas pourquoi vous en pensez autant sur le demandeur, ainsi que sur tous les autres qui aimeraient apprendre de cette question. Par exemple, Mac OS X est livré avec Ruby 1.8, donc aucune installation n'est requise pour ces utilisateurs.fonctionne à la fois en rubis 1.8 et en rubis 1.9.
la source
Par souci d'exhaustivité, puisque Ruby 1.9 String # chr renvoie le premier caractère d'une chaîne. Il est toujours disponible en 2.0 et 2.1.
http://ruby-doc.org/core-1.9.3/String.html#method-i-chr
la source
En IRM 1.8.7 ou plus:
la source
Dans les rails
la source
Essaye ça:
OU
la source
la source
"Smith"[0]
renverrait la valeur entière du caractère «S». Les deux versions obéissent"Smith"[0,1] == "S"
."Smith"[0] == ?S
c'est vrai sur Ruby 1.8 et 1.9En raison d'un choix de conception ennuyeux dans Ruby avant la version 1.9 -
some_string[0]
retourne le code de caractère du premier caractère - la façon la plus portable d'écrire ceci estsome_string[0,1]
, qui lui dit d'obtenir une sous-chaîne à l'index 0 de 1 caractère.la source
Une autre option qui n'a pas encore été mentionnée:
la source
Vous pouvez aussi utiliser
truncate
ou pour un formatage supplémentaire:
la source
Chacune de ces méthodes fonctionnera:
la source
.
aprèsname
. Et le dernier est insensé même si vous supprimez le.
, car il utilise deux méthodes différentes pour faire la même chose -[0]
etchr()
.