Bekerja dengan kelas Ruby: Kapitalisasi string
Saya mencoba memahami cara bekerja dengan Kelas di Ruby dan akan sangat menghargai beberapa wawasan tentang bidang ini. Saat ini, saya mendapat tugas yang agak sederhana untuk mengonversi string dengan awal setiap kata menggunakan huruf besar. Sebagai contoh:
Not Jaden-Cased: "How can mirrors be real if our eyes aren't real"
Jaden-Cased: "How Can Mirrors Be Real If Our Eyes Aren't Real"
Ini adalah kode saya saat ini:
class String
def toJadenCase
split
capitalize
end
end
#=> usual case: split.map(&:capitalize).join(' ')
Keluaran:
Expected: "The Moment That Truth Is Organized It Becomes A Lie.",
instead got: "The moment that truth is organized it becomes a lie."
Jawaban
Saya sarankan Anda tidak mencemari Stringkelas inti dengan penambahan metode contoh. Sebagai gantinya, tambahkan saja argumen ke metode untuk menahan string. Anda dapat melakukannya sebagai berikut, dengan menurunkan string kemudian menggunakan gsubdengan ekspresi reguler.
def to_jaden_case(str)
str.downcase.gsub(/(?<=\A| )[a-z]/) { |c| c.upcase }
end
to_jaden_case "The moMent That trUth is organized, it becomes a lie."
#=> "The Moment That Truth Is Organized, It Becomes A Lie."
Mesin regex Ruby melakukan operasi berikut.
(?<=\A| ) : use a positive lookbehind to assert that the following match
is immediately preceded by the start of the string or a space
[a-z] : match a lowercase letter
(?<=\A| )dapat diganti dengan tampilan negatif di belakang (?<![^ ]) , yang menegaskan bahwa kecocokan tidak diawali dengan karakter selain spasi.
Perhatikan bahwa dengan menggunakan String # gsub dengan ekspresi reguler (tidak seperti tarian split -process- join ), spasi ekstra dipertahankan.
Saat spasi harus dicocokkan dengan ekspresi reguler, sering kali orang melihat spasi ( \s) dicocokkan sebagai gantinya. Di sini, misalnya, /(?<=\A|\s)[a-z]/berfungsi dengan baik, tetapi terkadang mencocokkan spasi putih menyebabkan masalah, terutama karena keduanya juga cocok dengan baris baru ( \n) (serta spasi, tab, dan beberapa karakter lainnya). Saran saya adalah mencocokkan karakter spasi jika spasi harus dicocokkan. Jika tab harus dicocokkan juga, gunakan kelas karakter ( [ \t]).
Mencoba:
def toJadenCase
self.split.map(&:capitalize).join(' ')
end