2010-04-28 21 views
90

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

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

Así que si la cadena era "Smith" solo quiero "S".

+10

Como nota al margen, si se encuentra en los carriles que sólo puede hacer ' 'Smith '.first' –

Respuesta

107

Puede usar las clases abiertas de Ruby para que su código sea mucho más legible. Por ejemplo, esto:

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

le permitirá utilizar el método initial en cualquier cadena. Así que si usted tiene las siguientes variables:

last_name = "Smith" 
first_name = "John" 

Entonces usted puede conseguir las iniciales 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 Rubí 1.8 (no es que usted debe estar usando 1,8 más de todos modos - pero cuando esta respuesta fue publicada aún estaba bastante común):

puts 'Smith'[0]   # prints 83 

por supuesto, si no lo está haciendo de manera regular, a continuación, definir el método podría ser excesiva Y sólo podía hacerlo directamente:

puts last_name[0,1] 
4
>> 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 a '" Smith "[0,1] ==" S "'. – rampion

+1

@rampion: de hecho. Añadiría que '" Smith "[0] ==? S' es verdadero en Ruby 1.8 y 1.9 –

86

Si utiliza una versión reciente de Rubí (1.9.0 o posterior), el siguiente debería funcionar:

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

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

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

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

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

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

+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 a '" Smith "[0,1] ==" S "'. – rampion

+0

@rampion: Claro, pero no hay indicación en la pregunta de que el OP no usa la versión más reciente, entonces, ¿por qué molestarse en complicar las cosas? –

+0

Estoy de acuerdo con Jörg. No es necesario responder preguntas sobre el software heredado a menos que se especifique lo contrario. –

2

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

+0

str [0,1] tampoco funciona igual en 1.8 y 1.9, ya que en la primera devuelve el primer * byte * mientras que en la última devuelve el primer * carácter *. –

+1

Eso no es realmente una diferencia en cómo la indexación funciona tanto como en el soporte de 1.9 para lenguajes multibyte. Ambos están destinados a devolver el primer personaje, pero 1.8 tiene una visión más ingenua de lo que es un "personaje". – Chuck

27
"Smith"[0..0] 

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

+1

Esa es la mejor solución si se requiere soporte 1.8.6 y 1.9. – plang

14

En la RM 1.8.7 o superior:

'foobarbaz'.each_char.first 
+0

gracias por esto. Está funcionando para mí. – vijikumar

4

Prueba esto:

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

O

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

En Rails

name = 'Smith' 
name.first 
+0

manera fácil de usar. Gracias por responder. –

0

Cualquiera de estos métodos funcionarán:

name = 'Smith' 
puts name.[0..0] # => S 
puts name.[0] # => S 
puts name.[0,1] # => S 
puts name.[0].chr # => S 
+0

_Ninguno de estos métodos funcionará con ese '.' después de' name'. Y el último no es sensorial incluso si elimina el '.', porque está utilizando dos métodos diferentes para hacer lo mismo:' [0] '_and_' chr() '. – jeffdill2

0

Otra opción que no se ha mencionado todavía:

> "Smith".slice(0) 
#=> "S" 
Cuestiones relacionadas