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:
classStringdef initial
self[0,1]endend
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:
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.
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.
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".
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]echr() .
'Smith'.first
"Smith".chr #=> "S"
Respostas:
Você pode usar as classes abertas do Ruby para tornar seu código muito mais legível. Por exemplo, este:
permitirá que você use o
initial
método em qualquer string. Portanto, se você tiver as seguintes variáveis:Então você pode obter as iniciais de forma clara e legível:
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):
Claro, se você não estiver fazendo isso regularmente, definir o método pode ser um exagero e você pode simplesmente fazer isso diretamente:
fonte
Se você usar uma versão recente do Ruby (1.9.0 ou posterior), o seguinte deve funcionar:
Se você usar 1.9.0+ ou 1.8.7, o seguinte deve funcionar:
Se você usar uma versão anterior a 1.8.7, isso deve funcionar:
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 .fonte
"Smith"[0]
retornaria o valor inteiro do caractere 'S'. Ambas as versões obedecem"Smith"[0,1] == "S"
."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.funciona em Ruby 1.8 e Ruby 1.9.
fonte
Para completar, uma vez que Ruby 1.9 String # chr retorna o primeiro caractere de uma string. Ainda está disponível em 2.0 e 2.1.
http://ruby-doc.org/core-1.9.3/String.html#method-i-chr
fonte
Em MRI 1.8.7 ou superior:
fonte
Em Rails
fonte
Experimente isto:
OU
fonte
fonte
"Smith"[0]
retornaria o valor inteiro do caractere 'S'. Ambas as versões obedecem"Smith"[0,1] == "S"
."Smith"[0] == ?S
é verdade tanto no Ruby 1.8 quanto no 1.9Por 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.fonte
Outra opção que ainda não foi mencionada:
fonte
Você também pode usar
truncate
ou para formatação adicional:
fonte
Qualquer um desses métodos funcionará:
fonte
.
depoisname
. 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]
echr()
.