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


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] 

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 .


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.


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




12

Prueba esto:

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

O

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

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

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.


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"

0

También puedes usar truncate

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

o para formato adicional:

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

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

-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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.