Bekerja dengan kelas Ruby: Kapitalisasi string

Sep 23 2020

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

1 CarySwoveland Sep 23 2020 at 01:30

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]).

1 Ayudh Sep 22 2020 at 22:33

Mencoba:

 def toJadenCase
    self.split.map(&:capitalize).join(' ')
 end