Ruby: วิธีรับอักขระตัวแรกของสตริง


113

ฉันจะรับอักขระตัวแรกในสตริงโดยใช้ Ruby ได้อย่างไร

ท้ายที่สุดสิ่งที่ฉันกำลังทำคือการใช้นามสกุลของใครบางคนและสร้างตัวเริ่มต้นจากมัน

ดังนั้นถ้าสตริงเป็น "Smith" ฉันก็แค่ต้องการ "S"


10
โปรดทราบว่าหากคุณอยู่ใน Rails คุณสามารถทำได้'Smith'.first
Walking Wiki

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

คำตอบ:


128

คุณสามารถใช้คลาสแบบเปิดของ Ruby เพื่อทำให้โค้ดของคุณอ่านง่ายขึ้น ตัวอย่างเช่นสิ่งนี้:

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

จะอนุญาตให้คุณใช้initialวิธีการกับสตริงใดก็ได้ ดังนั้นหากคุณมีตัวแปรต่อไปนี้:

last_name = "Smith"
first_name = "John"

จากนั้นคุณจะได้รับชื่อย่ออย่างสะอาดและอ่านได้:

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

วิธีอื่นที่กล่าวถึงในที่นี้ใช้ไม่ได้กับ Ruby 1.8 (ไม่ใช่ว่าคุณควรใช้ 1.8 อีกต่อไป! - แต่เมื่อมีการโพสต์คำตอบนี้มันก็ยังค่อนข้างธรรมดา):

puts 'Smith'[0]           # prints 83

แน่นอนว่าหากคุณไม่ได้ทำมันเป็นประจำการกำหนดวิธีการนั้นอาจจะมากเกินไปและคุณสามารถทำได้โดยตรง:

puts last_name[0,1] 

101

หากคุณใช้ Ruby เวอร์ชันล่าสุด (1.9.0 หรือใหม่กว่า) สิ่งต่อไปนี้ควรใช้งานได้:

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

หากคุณใช้ 1.9.0+ หรือ 1.8.7 สิ่งต่อไปนี้ควรใช้งานได้:

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

หากคุณใช้เวอร์ชันเก่ากว่า 1.8.7 สิ่งนี้ควรใช้งานได้:

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

โปรดทราบว่า'Smith'[0,1]ไม่ได้ทำงานใน 1.8 ก็จะไม่ให้ตัวอักษรตัวแรกก็จะทำให้คุณเป็นคนแรกไบต์


1
โปรดทราบว่าสิ่งนี้ใช้ได้กับ Ruby 19 เท่านั้น ใน Ruby18 "Smith"[0]จะส่งคืนค่าจำนวนเต็มของอักขระ 'S' "Smith"[0,1] == "S"ทั้งสองรุ่นเชื่อฟัง
rampion

@rampion: แน่นอน แต่ไม่มีข้อบ่งชี้ในคำถามที่ว่า OP ไม่ได้ใช้เวอร์ชันล่าสุดดังนั้นทำไมต้องยุ่งยากกับสิ่งต่าง ๆ ?
Jörg W Mittag

4
Ruby 1.8 ไม่ใช่มรดก! ยังคงรองรับสาย Ruby 1.8 และส่วนใหญ่จะมีรุ่น 1.8.8 ออกมา ยิ่งไปกว่านั้นทั้ง JRuby และ Rubinius ยังไม่รองรับ 1.9 ฉันจะพนัน 5 $ ว่าวันนี้มีผู้ใช้มากกว่า 1.8 มากกว่า 1.9
Marc-André Lafortune

3
@ Jörg: คำตอบ"Smith"[0,1]ทำงานบน 1.8 (สมมติว่า ASCII) ไม่แน่ใจว่าทำไมคุณถึงคิดมากเกี่ยวกับผู้ร้องขอรวมถึงคนอื่น ๆ ที่ต้องการเรียนรู้จากคำถามนั้น ตัวอย่างเช่น Mac OS X มาพร้อมกับ Ruby 1.8 ดังนั้นผู้ใช้เหล่านี้จึงไม่จำเป็นต้องติดตั้ง
Marc-André Lafortune

3
คุณจะได้ชื่อย่อของชื่อ 'Ångström' (ใน UTF-8) ได้อย่างไรจึงจะทำงานได้ตามที่คาดไว้ทั้งใน Ruby 1.8.x และ 1.9.x วิธีที่แนะนำทั้งสองวิธีไม่สามารถใช้ได้ใน 1.8.x.
Lars Haugseth






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

1
โปรดทราบว่าสิ่งนี้ใช้ได้กับ Ruby 19 เท่านั้น ใน Ruby18 "Smith"[0]จะส่งคืนค่าจำนวนเต็มของอักขระ 'S' "Smith"[0,1] == "S"ทั้งสองรุ่นเชื่อฟัง
rampion

1
@rampion: แน่นอน ฉันจะเพิ่มว่า"Smith"[0] == ?Sเป็นจริงในทั้ง Ruby 1.8 และ 1.9
Marc-André Lafortune

2

เนื่องจากตัวเลือกการออกแบบที่น่ารำคาญใน Ruby ก่อน 1.9 - some_string[0]ส่งคืนรหัสอักขระของอักขระตัวแรก - วิธีที่พกพาง่ายที่สุดในการเขียนสิ่งนี้คือsome_string[0,1]บอกให้รับสตริงย่อยที่ดัชนี 0 ซึ่งมีความยาว 1 อักขระ


STR [0,1] ไม่ทำงานเดียวกันใน 1.8 และ 1.9 อย่างใดอย่างหนึ่งเช่นเดียวกับในอดีตก็จะส่งกลับคนแรกไบต์ในขณะที่หลังก็จะส่งกลับคนแรกที่ตัวละคร
Lars Haugseth

1
นั่นไม่ใช่ความแตกต่างในการทำงานของการจัดทำดัชนีมากนักเนื่องจากในเวอร์ชัน 1.9 รองรับภาษาหลายไบต์ ทั้งคู่ตั้งใจที่จะส่งคืนอักขระตัวแรก แต่ 1.8 มีมุมมองที่ไร้เดียงสามากกว่าว่า "ตัวละคร" คืออะไร
Chuck


0

คุณยังสามารถใช้ truncate

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

หรือสำหรับการจัดรูปแบบเพิ่มเติม:

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

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

-1

วิธีการใด ๆ เหล่านี้จะได้ผล:

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

1
ไม่มีวิธีการเหล่านี้จะทำงานร่วมกับที่หลัง. nameและสุดท้ายคือไม่ใช่ sensical แม้ว่าคุณจะลบ.เพราะมันใช้สองวิธีที่แตกต่างกันที่จะทำในสิ่งเดียวกัน - และ[0] chr()
jeffdill2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.