ฉันจะรับอักขระตัวแรกในสตริงโดยใช้ Ruby ได้อย่างไร
ท้ายที่สุดสิ่งที่ฉันกำลังทำคือการใช้นามสกุลของใครบางคนและสร้างตัวเริ่มต้นจากมัน
ดังนั้นถ้าสตริงเป็น "Smith" ฉันก็แค่ต้องการ "S"
"Smith".chr #=> "S"
ฉันจะรับอักขระตัวแรกในสตริงโดยใช้ Ruby ได้อย่างไร
ท้ายที่สุดสิ่งที่ฉันกำลังทำคือการใช้นามสกุลของใครบางคนและสร้างตัวเริ่มต้นจากมัน
ดังนั้นถ้าสตริงเป็น "Smith" ฉันก็แค่ต้องการ "S"
"Smith".chr #=> "S"
คำตอบ:
คุณสามารถใช้คลาสแบบเปิดของ 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]
หากคุณใช้ 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 ก็จะไม่ให้ตัวอักษรตัวแรกก็จะทำให้คุณเป็นคนแรกไบต์
"Smith"[0]
จะส่งคืนค่าจำนวนเต็มของอักขระ 'S' "Smith"[0,1] == "S"
ทั้งสองรุ่นเชื่อฟัง
"Smith"[0,1]
ทำงานบน 1.8 (สมมติว่า ASCII) ไม่แน่ใจว่าทำไมคุณถึงคิดมากเกี่ยวกับผู้ร้องขอรวมถึงคนอื่น ๆ ที่ต้องการเรียนรู้จากคำถามนั้น ตัวอย่างเช่น Mac OS X มาพร้อมกับ Ruby 1.8 ดังนั้นผู้ใช้เหล่านี้จึงไม่จำเป็นต้องติดตั้ง
"Smith"[0..0]
ใช้งานได้ทั้งทับทิม 1.8 และทับทิม 1.9
เพื่อความสมบูรณ์เนื่องจาก Ruby 1.9 String # chr จะส่งกลับอักขระตัวแรกของสตริง ยังคงมีอยู่ใน 2.0 และ 2.1
"Smith".chr #=> "S"
ใน MRI 1.8.7 หรือสูงกว่า:
'foobarbaz'.each_char.first
ลองสิ่งนี้:
>> a = "Smith"
>> a[0]
=> "S"
หรือ
>> "Smith".chr
#=> "S"
>> s = 'Smith'
=> "Smith"
>> s[0]
=> "S"
"Smith"[0]
จะส่งคืนค่าจำนวนเต็มของอักขระ 'S' "Smith"[0,1] == "S"
ทั้งสองรุ่นเชื่อฟัง
"Smith"[0] == ?S
เป็นจริงในทั้ง Ruby 1.8 และ 1.9
เนื่องจากตัวเลือกการออกแบบที่น่ารำคาญใน Ruby ก่อน 1.9 - some_string[0]
ส่งคืนรหัสอักขระของอักขระตัวแรก - วิธีที่พกพาง่ายที่สุดในการเขียนสิ่งนี้คือsome_string[0,1]
บอกให้รับสตริงย่อยที่ดัชนี 0 ซึ่งมีความยาว 1 อักขระ
อีกทางเลือกหนึ่งที่ยังไม่ได้กล่าวถึง:
> "Smith".slice(0)
#=> "S"
คุณยังสามารถใช้ truncate
> 'Smith'.truncate(1, omission: '')
#=> "S"
หรือสำหรับการจัดรูปแบบเพิ่มเติม:
> 'Smith'.truncate(4)
#=> "S..."
> 'Smith'.truncate(2, omission: '.')
#=> "S."
วิธีการใด ๆ เหล่านี้จะได้ผล:
name = 'Smith'
puts name.[0..0] # => S
puts name.[0] # => S
puts name.[0,1] # => S
puts name.[0].chr # => S
.
name
และสุดท้ายคือไม่ใช่ sensical แม้ว่าคุณจะลบ.
เพราะมันใช้สองวิธีที่แตกต่างกันที่จะทำในสิ่งเดียวกัน - และ[0]
chr()
'Smith'.first