Trabalhando com a classe Ruby: Capitalizando uma string

Sep 23 2020

Estou tentando entender como trabalhar com aulas de Ruby e gostaria muito de receber alguns insights sobre essa área. Atualmente, tenho uma tarefa bastante simples de converter uma string com o início de cada palavra em maiúsculas. Por exemplo:

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"

Este é o meu código atualmente:

class String
  def toJadenCase
    split
    capitalize

  end
end

#=> usual case: split.map(&:capitalize).join(' ')


Resultado:

Expected: "The Moment That Truth Is Organized It Becomes A Lie.",
 instead got: "The moment that truth is organized it becomes a lie."

Respostas

1 CarySwoveland Sep 23 2020 at 01:30

Eu sugiro que você não polua a Stringclasse principal com a adição de um método de instância. Em vez disso, basta adicionar um argumento ao método para conter a string. Você pode fazer isso da seguinte maneira, diminuindo o tamanho da string e usando gsubcom uma expressão regular.

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."

O mecanismo regex do Ruby executa as seguintes operações.

(?<=\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| )pode ser substituído pelo lookbehind negativo (?<![^ ]) , que afirma que a correspondência não é precedida por um caractere diferente de um espaço.

Observe que, usando String # gsub com uma expressão regular (ao contrário da dança split -process- join ), os espaços extras são preservados.

Quando os espaços devem ser correspondidos por uma expressão regular, geralmente vemos os espaços em branco ( \s) correspondidos. Aqui, por exemplo, /(?<=\A|\s)[a-z]/funciona bem, mas às vezes a correspondência de espaços em branco leva a problemas, principalmente porque eles também correspondem a novas linhas ( \n) (bem como espaços, tabulações e alguns outros caracteres). Meu conselho é combinar os caracteres de espaço se os espaços devem ser combinados. Se as guias devem ser correspondidas também, use uma classe de caractere ( [ \t]).

1 Ayudh Sep 22 2020 at 22:33

Tentar:

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