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".


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] 

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 .


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.


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




12

Essaye ça:

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

OU

>> "Smith".chr
#=> "S"

5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        

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.


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"

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."

-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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.