Ruby: Como obter o primeiro caractere de uma string

113

Como posso obter o primeiro caractere em uma string usando Ruby?

No final das contas, o que estou fazendo é pegar o sobrenome de alguém e apenas criar uma inicial a partir dele.

Então, se a string for "Smith", eu só quero "S".

Shpigford
fonte
10
Como uma observação lateral, se você está no Rails, você pode simplesmente fazer'Smith'.first
Walking Wiki
Ruby 1.9+ has"Smith".chr #=> "S"
Tyler James Young

Respostas:

128

Você pode usar as classes abertas do Ruby para tornar seu código muito mais legível. Por exemplo, este:

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

permitirá que você use o initialmétodo em qualquer string. Portanto, se você tiver as seguintes variáveis:

last_name = "Smith"
first_name = "John"

Então você pode obter as iniciais de forma clara e legível:

puts first_name.initial   # prints J
puts last_name.initial    # prints S

O outro método mencionado aqui não funciona no Ruby 1.8 (não que você deva usar mais o 1.8 de qualquer maneira! - mas quando esta resposta foi postada, ainda era bastante comum):

puts 'Smith'[0]           # prints 83

Claro, se você não estiver fazendo isso regularmente, definir o método pode ser um exagero e você pode simplesmente fazer isso diretamente:

puts last_name[0,1] 
iconoclasta
fonte
101

Se você usar uma versão recente do Ruby (1.9.0 ou posterior), o seguinte deve funcionar:

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

Se você usar 1.9.0+ ou 1.8.7, o seguinte deve funcionar:

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

Se você usar uma versão anterior a 1.8.7, isso deve funcionar:

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

Note-se que 'Smith'[0,1]se não trabalhar em 1.8, ele vai não dar-lhe o primeiro caractere, ele só irá dar-lhe o primeiro byte .

Jörg W Mittag
fonte
1
observe que isso só funciona em ruby19. em ruby18 "Smith"[0]retornaria o valor inteiro do caractere 'S'. Ambas as versões obedecem "Smith"[0,1] == "S".
rampion
@rampion: Claro, mas não há nenhuma indicação na pergunta de que o OP não usa a versão mais recente, então por que complicar as coisas?
Jörg W Mittag
4
Ruby 1.8 não é legado! A linha Ruby 1.8 ainda é suportada e provavelmente haverá uma versão 1.8.8 lançada. Além disso, nem JRuby nem Rubinius ainda suportam 1.9. Eu apostaria 5 $ que existem hoje muito mais usuários de 1.8 do que 1.9.
Marc-André Lafortune
3
@ Jörg: A resposta "Smith"[0,1]funciona no 1.8 (assumindo ASCII). Não sei por que você presume tanto sobre o solicitante, bem como sobre todos os outros que gostariam de aprender com essa pergunta. Por exemplo, o Mac OS X vem com Ruby 1.8, portanto, nenhuma instalação é necessária para esses usuários.
Marc-André Lafortune
3
Como você obteria a inicial do nome 'Ångström' (em UTF-8) para que funcionasse como esperado em Ruby 1.8.xe 1.9.x? Nenhum dos métodos sugeridos funcionaria em 1.8.x.
Lars Haugseth
30
"Smith"[0..0]

funciona em Ruby 1.8 e Ruby 1.9.

Andrew Grimm
fonte
1
Essa é a melhor solução se o suporte 1.8.6 e 1.9 for necessário.
plang
14

Em MRI 1.8.7 ou superior:

'foobarbaz'.each_char.first
Wayne Conrad
fonte
12

Em Rails

name = 'Smith'
name.first 
Suganya
fonte
maneira fácil de usar. Obrigado pela resposta.
AMIC MING
12

Experimente isto:

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

OU

>> "Smith".chr
#=> "S"
Gagan Gami
fonte
5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        
SilentGhost
fonte
1
observe que isso só funciona em ruby19. em ruby18 "Smith"[0]retornaria o valor inteiro do caractere 'S'. Ambas as versões obedecem "Smith"[0,1] == "S".
rampion
1
@rampion: certamente. Eu acrescentaria que isso "Smith"[0] == ?Sé verdade tanto no Ruby 1.8 quanto no 1.9
Marc-André Lafortune
2

Por causa de uma escolha de design irritante em Ruby antes de 1.9 - some_string[0]retorna o código de caractere do primeiro caractere - a maneira mais portátil de escrever isso é some_string[0,1], o que o informa para obter uma substring no índice 0 com 1 caractere de comprimento.

Mandril
fonte
str [0,1] também não funciona da mesma forma em 1.8 e 1.9, pois no primeiro retorna o primeiro byte, enquanto no segundo retorna o primeiro caractere .
Lars Haugseth
1
Essa não é realmente uma diferença em como a indexação funciona tanto quanto no suporte do 1.9 para linguagens multibyte. Ambos devem retornar o primeiro personagem, mas 1.8 tem uma visão mais ingênua do que é um "personagem".
Chuck
2

Outra opção que ainda não foi mencionada:

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

Você também pode usar truncate

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

ou para formatação adicional:

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

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

Qualquer um desses métodos funcionará:

name = 'Smith'
puts name.[0..0] # => S
puts name.[0] # => S
puts name.[0,1] # => S
puts name.[0].chr # => S
Saranki Magenthirarajah
fonte
1
Nenhum desses métodos funcionará com isso .depois name. E o último não faz sentido, mesmo se você remover o ., porque está usando dois métodos diferentes para fazer a mesma coisa - [0] e chr() .
jeffdill2