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

Shpigford
quelle
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] 
Bilderstürmer
quelle
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 .

Jörg W Mittag
quelle
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.

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

In der MRT 1.8.7 oder höher:

'foobarbaz'.each_char.first
Wayne Conrad
quelle
12

In Schienen

name = 'Smith'
name.first 
Suganya
quelle
einfache Art zu bedienen. Danke für die Antwort.
AMIC MING
11

Versuche dies:

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

ODER

>> "Smith".chr
#=> "S"
Gagan Gami
quelle
5
>> s = 'Smith'                                                          
=> "Smith"                                                              
>> s[0]                                                                 
=> "S"                                                        
SilentGhost
quelle
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.

Futter
quelle
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"
jeffdill2
quelle
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."
Eric Norcross
quelle
-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
Saranki Magenthirarajah
quelle
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