Ruby: cómo obtener el primer carácter de una cadena

113

¿Cómo puedo obtener el primer carácter de una cadena usando Ruby?

En última instancia, lo que estoy haciendo es tomar el apellido de alguien y simplemente crear una inicial.

Entonces, si la cadena era "Smith", solo quiero "S".

Shpigford
fuente
10
Como nota al margen, si estás en Rails, puedes hacerlo'Smith'.first
Walking Wiki
Ruby 1.9+ tiene"Smith".chr #=> "S"
Tyler James Young

Respuestas:

128

Puedes usar las clases abiertas de Ruby para hacer tu código mucho más legible. Por ejemplo, esto:

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

le permitirá utilizar el initialmétodo en cualquier cadena. Entonces, si tiene las siguientes variables:

last_name = "Smith"
first_name = "John"

Entonces puede obtener las iniciales de manera muy limpia y legible:

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

El otro método mencionado aquí no funciona en Ruby 1.8 (¡no es que deba seguir usando 1.8 de todos modos! - pero cuando se publicó esta respuesta, todavía era bastante común):

puts 'Smith'[0]           # prints 83

Por supuesto, si no lo está haciendo de forma regular, entonces definir el método podría ser excesivo y podría hacerlo directamente:

puts last_name[0,1] 
iconoclasta
fuente
101

Si usa una versión reciente de Ruby (1.9.0 o posterior), lo siguiente debería funcionar:

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

Si usa 1.9.0+ o 1.8.7, lo siguiente debería funcionar:

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

Si usa una versión anterior a 1.8.7, esto debería funcionar:

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

Tenga en cuenta que 'Smith'[0,1]no no funciona en 1.8, será no darle el primer carácter, que sólo le dará el primer byte .

Jörg W Mittag
fuente
1
tenga en cuenta que esto solo funciona en ruby19. en ruby18 "Smith"[0]devolvería el valor entero del carácter 'S'. Ambas versiones obedecen "Smith"[0,1] == "S".
rampion
@rampion: Claro, pero no hay indicios en la pregunta de que el OP no use la versión más reciente, así que ¿por qué molestarse en complicar las cosas?
Jörg W Mittag
4
¡Ruby 1.8 no es un legado! La línea Ruby 1.8 todavía es compatible y lo más probable es que se publique una versión 1.8.8. Además, ni JRuby ni Rubinius son compatibles con 1.9. Apostaría 5 $ a que hoy en día hay muchos más usuarios de 1.8 que de 1.9.
Marc-André Lafortune
3
@ Jörg: La respuesta "Smith"[0,1]funciona en 1.8 (asumiendo ASCII). No estoy seguro de por qué asume tanto sobre el solicitante, así como sobre todos los demás a los que les gustaría aprender de esa pregunta. Por ejemplo, Mac OS X viene con Ruby 1.8, por lo que no se requiere instalación para estos usuarios.
Marc-André Lafortune
3
¿Cómo obtendría la inicial del nombre 'Ångström' (en UTF-8) para que funcione como se espera en Ruby 1.8.xy 1.9.x? Ninguno de los métodos sugeridos funcionaría en 1.8.x.
Lars Haugseth
30
"Smith"[0..0]

funciona tanto en ruby ​​1.8 como en ruby ​​1.9.

Andrew Grimm
fuente
1
Esa es la mejor solución si se requiere compatibilidad con 1.8.6 y 1.9.
plang
14

En MRI 1.8.7 o superior:

'foobarbaz'.each_char.first
Wayne Conrad
fuente
12

En rieles

name = 'Smith'
name.first 
Suganya
fuente
forma fácil de usar. Gracias por responder.
AMIC MING
12

Prueba esto:

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

O

>> "Smith".chr
#=> "S"
Gagan Gami
fuente
5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        
SilentGhost
fuente
1
tenga en cuenta que esto solo funciona en ruby19. en ruby18 "Smith"[0]devolvería el valor entero del carácter 'S'. Ambas versiones obedecen "Smith"[0,1] == "S".
rampion
1
@rampion: de hecho. Yo agregaría que eso "Smith"[0] == ?Ses cierto tanto en Ruby 1.8 como en 1.9
Marc-André Lafortune
2

Debido a una elección de diseño molesta en Ruby antes de 1.9, some_string[0]devuelve el código de carácter del primer carácter, la forma más portátil de escribir esto es some_string[0,1], que le dice que obtenga una subcadena en el índice 0 de 1 carácter de longitud.

Arrojar
fuente
str [0,1] tampoco funciona igual en 1.8 y 1.9, ya que en el primero devuelve el primer byte mientras que en el segundo devuelve el primer carácter .
Lars Haugseth
1
Eso no es realmente una diferencia en cómo funciona la indexación tanto como en el soporte de 1.9 para lenguajes multibyte. Ambos están destinados a devolver el primer carácter, pero 1.8 tiene una visión más ingenua de lo que es un "personaje".
Chuck
2

Otra opción que aún no se ha mencionado:

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

También puedes usar truncate

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

o para formato adicional:

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

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

Cualquiera de estos 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
fuente
1
Ninguno de estos métodos funcionará con eso .después name. Y el último no tiene sentido incluso si elimina el ., porque utiliza dos métodos diferentes para hacer lo mismo: [0] y chr() .
jeffdill2