วนซ้ำอักขระแต่ละตัวของสตริงในทับทิม 1.8.6 (each_char)


86

ฉันยังใหม่กับทับทิมและกำลังพยายามใช้งานตัวละครแต่ละตัวแยกจากสตริงพื้นฐานในทับทิม ฉันใช้ทับทิม 1.8.6 และต้องการทำสิ่งที่ชอบ:

"ABCDEFG".each_char do |i|
  puts i
end

สิ่งนี้ก่อให้เกิดข้อผิดพลาดวิธีการที่ไม่ได้กำหนด `` each_char '

ฉันคาดหวังว่าจะเห็นผลลัพธ์แนวตั้งของ:

A
B
C
D
..etc

เป็นeach_charวิธีการที่กำหนดไว้เพียง 1.9? ฉันลองใช้eachวิธีธรรมดาแต่บล็อกเพียงแค่ดึงสตริงทั้งหมดในบรรทัดเดียว วิธีเดียวที่ฉันคิดว่าจะทำอย่างไรซึ่งค่อนข้างไม่สะดวกคือการสร้างอาร์เรย์ของอักขระตั้งแต่ต้น:

['A','B','C','D','...'].each do|i|
  puts i
end

สิ่งนี้ได้ผลลัพธ์ที่ต้องการ:

A
B
C
..etc

อาจมีวิธีที่จะทำให้ได้ผลลัพธ์นี้โดยใช้สตริงที่ไม่ได้แก้ไขเพื่อเริ่มต้นด้วยหรือไม่?

ฉันคิดว่า Java ที่เทียบเท่าคือ:

for (int i = 0; i < aString.length(); i++){
  char currentChar = aString.charAt(i);
  System.out.println(currentChar);
}

1
"asfds" .char.each ....
Muhammad Umer

คำตอบ:


115

ผมมีปัญหาเดียวกัน. ฉันมักจะใช้String#split:

"ABCDEFG".split("").each do |i|
  puts i
end

ฉันเดาว่าคุณสามารถใช้งานได้ด้วยตัวเองเช่นนี้:

class String
  def each_char
    self.split("").each { |i| yield i }
  end
end

แก้ไข:อีกทางเลือกหนึ่งคือString#each_byteมีอยู่ใน Ruby 1.8.6 ซึ่งส่งคืนค่า ASCII ของอักขระแต่ละตัวในสตริง ASCII:

"ABCDEFG".each_byte do |i|
  puts i.chr # Fixnum#chr converts any number to the ASCII char it represents
end

ขอบคุณสำหรับเคล็ดลับที่เป็นประโยชน์ มันทำงานได้ดี วิธี each_char ใช้สำหรับอะไร? สำหรับเวอร์ชันใหม่กว่าฉันคิดว่า?
denchr

จนถึงตอนนี้ฉันยังไม่ได้ตรวจสอบ แต่หลังจาก Googling ไปหน่อยเห็นได้ชัดว่ามีการระบุไว้อย่างไม่ถูกต้องในเอกสาร 1.8.6 แต่ไม่สามารถใช้ได้จนถึง 1.8.7
Jeremy Ruten

เมธอด each_char ใช้สำหรับเวอร์ชันเก่ากว่าซึ่งไม่มี ยังไม่ได้รับการบันทึกไว้ที่ruby-doc.org/core/classes/String.html#M000862และที่น่าแปลกใจคือฉันเห็นว่า each_char ให้ผลสตริงเช่นเดียวกับการแยกของเจเรมี
Martin Dorey

15

ขยายความคิดเห็นของ la_f0ka โดยเฉพาะ หากคุณต้องการตำแหน่งดัชนีในโค้ดของคุณคุณควรจะทำได้

s = 'ABCDEFG'
for pos in 0...s.length
    puts s[pos].chr
end

.chrเป็นสิ่งสำคัญเช่นทับทิม <1.9 ผลตอบแทนที่รหัสของตัวละครที่ตำแหน่งนั้นแทนการย่อยของตัวละครตัวหนึ่งที่ตำแหน่งนั้น


5
0..s.length - 1=0...s.length
MatthewRock

ขอบคุณ @MatthewRock การเปลี่ยนแปลง
sschuberth

1

มีปัญหาจริงๆใน 1.8.6 และหลังจากฉบับนี้เรียบร้อยแล้ว

ใน 1.8.6 คุณสามารถเพิ่มสิ่งนี้:

requre 'jcode'

1

แต่ตอนนี้คุณสามารถทำอะไรได้อีกมากมาย:

a = "cruel world"

a.scan(/\w+/)        #=> ["cruel", "world"]

a.scan(/.../)        #=> ["cru", "el ", "wor"]

a.scan(/(...)/)      #=> [["cru"], ["el "], ["wor"]]

a.scan(/(..)(..)/)   #=> [["cr", "ue"], ["l ", "wo"]]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.