Ruby: Bir dizenin ilk karakteri nasıl elde edilir


113

Ruby kullanarak bir dizedeki ilk karakteri nasıl elde edebilirim?

Nihayetinde yaptığım şey birinin soyadını almak ve ondan bir baş harf çıkarmak.

Yani dizi "Smith" ise sadece "S" istiyorum.


10
Bir yan not olarak, Rails'teyseniz şunu yapabilirsiniz'Smith'.first
Walking Wiki

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

Yanıtlar:


128

Kodunuzu daha okunaklı hale getirmek için Ruby'nin açık sınıflarını kullanabilirsiniz. Örneğin, bu:

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

initialyöntemi herhangi bir dizede kullanmanıza izin verir . Yani aşağıdaki değişkenlere sahipseniz:

last_name = "Smith"
first_name = "John"

O zaman baş harflerini çok temiz ve okunaklı bir şekilde alabilirsiniz:

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

Burada bahsedilen diğer yöntem Ruby 1.8'de çalışmıyor (zaten 1.8 kullanıyor olmanız gerekmiyor! - ama bu cevap gönderildiğinde hala oldukça yaygındı):

puts 'Smith'[0]           # prints 83

Elbette, düzenli olarak yapmıyorsanız, yöntemi tanımlamak aşırı olabilir ve bunu doğrudan yapabilirsiniz:

puts last_name[0,1] 

101

Ruby'nin yeni bir sürümünü (1.9.0 veya üstü) kullanıyorsanız, aşağıdakiler çalışmalıdır:

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

1.9.0+ veya 1.8.7 kullanıyorsanız, aşağıdakiler çalışmalıdır:

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

1.8.7'den daha eski bir sürüm kullanıyorsanız, bu çalışmalıdır:

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

Not 'Smith'[0,1]yok değil 1.8 üzerinde çalışmak, bu olacak değil sadece size ilk verecektir size ilk karakter vermek bayt .


1
bunun yalnızca ruby19'da çalıştığını unutmayın. ruby18'de "Smith"[0]'S' karakterinin tamsayı değerini döndürür. Her iki versiyon da itaat eder "Smith"[0,1] == "S".
rampion

@rampion: Elbette, ancak soruda OP'nin en son sürümü kullanmadığına dair bir gösterge yok, öyleyse neden işleri karmaşıklaştırmaya çalışalım?
Jörg W Mittag

4
Ruby 1.8 miras değildir! Ruby 1.8 hattı hala desteklenmektedir ve büyük olasılıkla 1.8.8 sürümü çıkacaktır. Dahası, ne JRuby ne de Rubinius henüz 1.9'u desteklemiyor. Bugün 1.8'den 1.9'dan çok daha fazla kullanıcı olduğuna 5 $ bahse girerim.
Marc-André Lafortune

3
@ Jörg: Cevap "Smith"[0,1]1.8'de çalışıyor (ASCII varsayılarak). İstekte bulunan kişi ve bu sorudan öğrenmek isteyen diğer herkes hakkında neden bu kadar çok şey düşündüğünüzden emin değilim. Örneğin, Mac OS X Ruby 1.8 ile birlikte gelir, bu nedenle bu kullanıcılar için kurulum gerekmez.
Marc-André Lafortune

3
Ruby 1.8.x ve 1.9.x'te beklendiği gibi çalışması için 'Ångström' adının baş harfini (UTF-8'de) nasıl elde edersiniz? Önerilen yöntemlerin hiçbiri 1.8.x'te çalışmaz.
Lars Haugseth

30
"Smith"[0..0]

hem yakut 1.8 hem de yakut 1.9'da çalışır.


1
1.8.6 ve 1.9 desteği gerekiyorsa en iyi çözüm budur.
planlanan




12

Bunu dene:

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

VEYA

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

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

1
bunun yalnızca ruby19'da çalıştığını unutmayın. ruby18'de "Smith"[0]'S' karakterinin tamsayı değerini döndürür. Her iki versiyon da itaat eder "Smith"[0,1] == "S".
rampa

1
@rampion: gerçekten. Bunun "Smith"[0] == ?Shem Ruby 1.8 hem de 1.9 için doğru olduğunu eklemeliyim
Marc-André Lafortune

2

Ruby'de 1.9'dan önceki sinir bozucu tasarım seçimi nedeniyle - ilk karakterin karakter kodunusome_string[0] döndürür - bunu yazmanın en taşınabilir yolu , 0 dizininde 1 karakter uzunluğunda bir alt dize almasını söylemektir.some_string[0,1]


str [0,1] 1.8 ve 1.9'da da aynı şekilde çalışmaz, birincisinde olduğu gibi ilk baytı , ikincisinde ise ilk karakteri döndürür .
Lars Haugseth

1
Bu, 1.9'un çok baytlı dilleri desteklemesindeki kadar indekslemenin nasıl çalıştığı konusunda gerçekten bir fark değil. Her ikisi de ilk karakteri döndürmek içindir, ancak 1.8 "karakter" in ne olduğu konusunda daha saf bir görüşe sahiptir.
Chuck

2

Henüz bahsedilmeyen başka bir seçenek:

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

0

Ayrıca kullanabilirsiniz truncate

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

veya ek biçimlendirme için:

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

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

-1

Bu yöntemlerden herhangi biri işe yarayacaktır:

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

1
Bu yöntemlerin hiçbiri daha .sonra bununla çalışmayacaktır name. Ve sonuncusu, kaldırsanız bile anlamsızdır ., çünkü aynı şeyi yapmak için iki farklı yöntem kullanıyor - [0] ve chr() .
jeffdill2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.