Ruby: Comment obtenir le premier caractère d'une chaîne

113

Comment puis-je obtenir le premier caractère d'une chaîne en utilisant Ruby?

En fin de compte, ce que je fais, c'est prendre le nom de famille de quelqu'un et simplement en créer une initiale.

Donc, si la chaîne était "Smith", je veux juste "S".

Shpigford
la source
10
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:

class String
  def initial
    self[0,1]
  end
end

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:

puts last_name[0,1] 
iconoclaste
la source
101

Si vous utilisez une version récente de Ruby (1.9.0 ou ultérieure), les éléments suivants devraient fonctionner:

'Smith'[0] # => 'S'

Si vous utilisez 1.9.0+ ou 1.8.7, les éléments suivants devraient fonctionner:

'Smith'.chars.first # => 'S'

Si vous utilisez une version antérieure à la 1.8.7, cela devrait fonctionner:

'Smith'.split(//).first # => 'S'

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 .

Jörg W Mittag
la source
1
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.

Andrew Grimm
la source
1
C'est la meilleure solution si le support 1.8.6 et 1.9 est requis.
plang le
14

En IRM 1.8.7 ou plus:

'foobarbaz'.each_char.first
Wayne Conrad
la source
12

Dans les rails

name = 'Smith'
name.first 
Suganya
la source
moyen facile à utiliser. Merci de répondre.
AMIC MING
12

Essaye ça:

>> a = "Smith"
>> a[0]
=> "S"

OU

>> "Smith".chr
#=> "S"
Gagan Gami
la source
5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        
SilentGhost
la source
1
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.

Mandrin
la source
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:

> "Smith".slice(0)
#=> "S"
jeffdill2
la source
0

Vous pouvez aussi utiliser truncate

> 'Smith'.truncate(1, omission: '')
#=> "S"

ou pour un formatage supplémentaire:

> 'Smith'.truncate(4)
#=> "S..."

> 'Smith'.truncate(2, omission: '.')
#=> "S."
Eric Norcross
la source
-1

Chacune de ces méthodes fonctionnera:

name = 'Smith'
puts name.[0..0] # => S
puts name.[0] # => S
puts name.[0,1] # => S
puts name.[0].chr # => S
Saranki Magenthirarajah
la source
1
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] et chr() .
jeffdill2