Ruby: So erhalten Sie das erste Zeichen einer Zeichenfolge


113

Wie kann ich mit Ruby das erste Zeichen in einer Zeichenfolge erhalten?

Letztendlich nehme ich den Nachnamen einer Person und erstelle daraus eine Initiale.

Wenn die Zeichenfolge also "Smith" war, möchte ich nur "S".


10
Als Randnotiz, wenn Sie in Rails sind, können Sie einfach tun'Smith'.first
Walking Wiki

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

Antworten:


128

Sie können die offenen Klassen von Ruby verwenden, um Ihren Code besser lesbar zu machen. Zum Beispiel:

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

Mit dieser initialMethode können Sie die Methode für jede Zeichenfolge verwenden. Wenn Sie also die folgenden Variablen haben:

last_name = "Smith"
first_name = "John"

Dann können Sie die Initialen sehr sauber und lesbar erhalten:

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

Die andere hier erwähnte Methode funktioniert nicht mit Ruby 1.8 (nicht, dass Sie 1.8 sowieso nicht mehr verwenden sollten! - aber als diese Antwort veröffentlicht wurde, war sie immer noch recht verbreitet):

puts 'Smith'[0]           # prints 83

Wenn Sie dies nicht regelmäßig tun, kann das Definieren der Methode natürlich übertrieben sein, und Sie können es einfach direkt tun:

puts last_name[0,1] 

101

Wenn Sie eine neuere Version von Ruby (1.9.0 oder höher) verwenden, sollte Folgendes funktionieren:

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

Wenn Sie entweder 1.9.0+ oder 1.8.7 verwenden, sollte Folgendes funktionieren:

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

Wenn Sie eine Version verwenden, die älter als 1.8.7 ist, sollte dies funktionieren:

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

Beachten Sie, dass 'Smith'[0,1]dies unter 1.8 nicht funktioniert. Sie erhalten nicht das erste Zeichen, sondern nur das erste Byte .


1
Beachten Sie, dass dies nur in ruby19 funktioniert. in ruby18 "Smith"[0]würde den ganzzahligen Wert des Zeichens 'S' zurückgeben. Beide Versionen gehorchen "Smith"[0,1] == "S".
Rampion

@rampion: Sicher, aber die Frage enthält keinen Hinweis darauf, dass das OP nicht die neueste Version verwendet. Warum also die Dinge komplizieren?
Jörg W Mittag

4
Ruby 1.8 ist kein Vermächtnis! Die Ruby 1.8-Linie wird weiterhin unterstützt und es wird höchstwahrscheinlich eine Version 1.8.8 veröffentlicht. Darüber hinaus unterstützen weder JRuby noch Rubinius noch 1.9. Ich würde 5 $ wetten, dass es heute weit mehr Benutzer von 1,8 als 1,9 gibt.
Marc-André Lafortune

3
@ Jörg: Die Antwort "Smith"[0,1]funktioniert auf 1.8 (unter der Annahme von ASCII). Ich bin mir nicht sicher, warum Sie so viel über den Antragsteller und über alle anderen annehmen, die aus dieser Frage lernen möchten. Mac OS X wird beispielsweise mit Ruby 1.8 geliefert, sodass für diese Benutzer keine Installation erforderlich ist.
Marc-André Lafortune

3
Wie würden Sie die Initiale des Namens 'Ångström' (in UTF-8) erhalten, damit sie sowohl in Ruby 1.8.x als auch in 1.9.x wie erwartet funktioniert? Keine der vorgeschlagenen Methoden würde in 1.8.x funktionieren.
Lars Haugseth

30
"Smith"[0..0]

funktioniert sowohl in Ruby 1.8 als auch in Ruby 1.9.


1
Dies ist die beste Lösung, wenn Unterstützung für 1.8.6 und 1.9 erforderlich ist.
Plang




11

Versuche dies:

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

ODER

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

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

1
Beachten Sie, dass dies nur in ruby19 funktioniert. in ruby18 "Smith"[0]würde den ganzzahligen Wert des Zeichens 'S' zurückgeben. Beide Versionen gehorchen "Smith"[0,1] == "S".
Rampion

1
@ Rampion: in der Tat. Ich würde hinzufügen, dass "Smith"[0] == ?Sdies sowohl für Ruby 1.8 als auch für 1.9 gilt
Marc-André Lafortune

2

Aufgrund einer nervigen Designauswahl in Ruby vor 1.9 - some_string[0]gibt den Zeichencode des ersten Zeichens zurück - ist die portabelste Methode, dies zu schreiben some_string[0,1], die Anweisung, eine Teilzeichenfolge bei Index 0 zu erhalten, die 1 Zeichen lang ist.


str [0,1] funktioniert auch in 1.8 und 1.9 nicht gleich, da im ersten das erste Byte zurückgegeben wird, während im zweiten das erste Zeichen zurückgegeben wird .
Lars Haugseth

1
Das ist nicht wirklich ein Unterschied in der Funktionsweise der Indizierung, sondern in der Unterstützung von 1.9 für Multibyte-Sprachen. Sie sollen beide das erste Zeichen zurückgeben, aber 1.8 hat eine naivere Sicht auf das, was ein "Zeichen" ist.
Chuck

2

Eine weitere Option, die noch nicht erwähnt wurde:

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

0

Sie können auch verwenden truncate

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

oder für zusätzliche Formatierung:

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

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

-1

Jede dieser Methoden funktioniert:

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

1
Keine dieser Methoden wird mit dieser Arbeit .nach name. Und der letzte ist unsinnig, selbst wenn Sie den entfernen ., weil er zwei verschiedene Methoden verwendet, um dasselbe zu tun - [0] und chr() .
Jeffdill2
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.