Ruby: come ottenere il primo carattere di una stringa


113

Come posso ottenere il primo carattere di una stringa usando Ruby?

Alla fine quello che sto facendo è prendere il cognome di qualcuno e crearne solo un'iniziale.

Quindi, se la stringa era "Smith", voglio solo "S".


10
Come nota a margine, se sei in Rails puoi semplicemente fare'Smith'.first
Walking Wiki

Ruby 1.9+ ha"Smith".chr #=> "S"
Tyler James Young

Risposte:


128

Puoi usare le classi aperte di Ruby per rendere il tuo codice molto più leggibile. Ad esempio, questo:

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

ti permetterà di usare il initialmetodo su qualsiasi stringa. Quindi, se hai le seguenti variabili:

last_name = "Smith"
first_name = "John"

Quindi puoi ottenere le iniziali in modo molto chiaro e leggibile:

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

L'altro metodo menzionato qui non funziona su Ruby 1.8 (non che dovresti comunque usare 1.8! - ma quando questa risposta è stata pubblicata era ancora abbastanza comune):

puts 'Smith'[0]           # prints 83

Ovviamente, se non lo fai regolarmente, definire il metodo potrebbe essere eccessivo e potresti farlo direttamente:

puts last_name[0,1] 

101

Se utilizzi una versione recente di Ruby (1.9.0 o successiva), dovrebbe funzionare quanto segue:

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

Se utilizzi 1.9.0+ o 1.8.7, dovrebbe funzionare quanto segue:

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

Se utilizzi una versione precedente alla 1.8.7, dovrebbe funzionare:

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

Si noti che 'Smith'[0,1]non non funziona su 1.8, vi non vi darà il primo carattere, che solo vi darà il primo byte di .


1
nota che funziona solo in ruby19. in ruby18 "Smith"[0]restituirebbe il valore intero del carattere "S". Entrambe le versioni obbediscono "Smith"[0,1] == "S".
rampion

@ Rampion: Certo, ma nella domanda non c'è alcuna indicazione che l'OP non utilizzi la versione più recente, quindi perché preoccuparsi di complicare le cose?
Jörg W Mittag

4
Ruby 1.8 non è un'eredità! La linea Ruby 1.8 è ancora supportata e molto probabilmente sarà rilasciata una versione 1.8.8. Inoltre, né JRuby né Rubinius supportano ancora 1.9. Scommetterei 5 $ che oggi ci sono molti più utenti di 1.8 rispetto a 1.9.
Marc-André Lafortune

3
@ Jörg: La risposta "Smith"[0,1]funziona su 1.8 (assumendo ASCII). Non sono sicuro del motivo per cui presumi così tanto sul richiedente, così come su tutti gli altri che vorrebbero imparare da quella domanda. Ad esempio, Mac OS X viene fornito in bundle con Ruby 1.8, quindi non è richiesta alcuna installazione per questi utenti.
Marc-André Lafortune

3
Come si otterrebbe l'iniziale del nome "Ångström" (in UTF-8) in modo che funzioni come previsto sia in Ruby 1.8.x che in 1.9.x? Nessuno dei metodi suggeriti funzionerebbe in 1.8.x.
Lars Haugseth

30
"Smith"[0..0]

funziona sia in Ruby 1.8 che in Ruby 1.9.


1
Questa è la soluzione migliore se è richiesto il supporto 1.8.6 e 1.9.
Plang




12

Prova questo:

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

O

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

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

1
nota che funziona solo in ruby19. in ruby18 "Smith"[0]restituirebbe il valore intero del carattere "S". Entrambe le versioni obbediscono "Smith"[0,1] == "S".
rampion

1
@rampion: infatti. Aggiungo che "Smith"[0] == ?Sè vero sia su Ruby 1.8 che su 1.9
Marc-André Lafortune

2

A causa di una fastidiosa scelta di progettazione in Ruby prima della 1.9 - some_string[0]restituisce il codice del carattere del primo carattere - il modo più portatile per scriverlo è some_string[0,1], che gli dice di ottenere una sottostringa all'indice 0 lunga 1 carattere.


str [0,1] non funziona allo stesso modo neanche in 1.8 e 1.9, in quanto nel primo restituisce il primo byte mentre nel secondo restituisce il primo carattere .
Lars Haugseth

1
Questa non è davvero una differenza nel modo in cui funziona l'indicizzazione quanto nel supporto 1.9 per i linguaggi multibyte. Entrambi intendono restituire il primo personaggio, ma 1.8 ha una visione più ingenua di cosa sia un "personaggio".
Chuck

2

Un'altra opzione che non è stata ancora menzionata:

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

0

Puoi anche usare truncate

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

o per una formattazione aggiuntiva:

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

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

-1

Uno qualsiasi di questi metodi funzionerà:

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

1
Nessuno di questi metodi funzionerà con quello .dopo name. E l'ultimo non ha senso anche se rimuovi il ., perché utilizza due metodi diversi per fare la stessa cosa - [0] e chr() .
jeffdill2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.