ruby-on-rails - tutorial - ruby web app




Conversione di stringa da snake_case a CamelCase in Ruby (6)

Sto provando a convertire un nome da caso serpente a caso cammello. Esistono metodi integrati?

Ad es .: "app_user" in "AppUser"

(Ho una stringa "app_user" Voglio convertirla in modello AppUser ).


Punto di riferimento per soluzioni puramente Ruby

Ho preso tutte le possibilità che avevo in mente di farlo con codice rubino puro, eccoli qui:

  • capitalizza e gsub

    "app_user".capitalize.gsub(/_(\w)/){$1.upcase}
    
  • dividi e mappa usando & abbreviazione (grazie alla risposta dell'utente3869936)

    "app_user".split('_').map(&:capitalize).join
    
  • dividere e mappare (grazie alla risposta di Mr. Black)

    "app_user".split('_').map{|e| e.capitalize}.join
    

Ed ecco il Benchmark per tutti questi, possiamo vedere che gsub è piuttosto negativo per questo. Ho usato 126 080 parole.

                              user     system      total        real
capitalize and gsub  :      0.360000   0.000000   0.360000 (  0.357472)
split and map, with &:      0.190000   0.000000   0.190000 (  0.189493)
split and map        :      0.170000   0.000000   0.170000 (  0.171859)

Che ne dici di questo?

"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"

Trovato nei commenti qui: Classificare una stringa di Ruby

Vedi il commento di Wayne Conrad


La maggior parte degli altri metodi elencati qui sono specifici di Rails. Se vuoi farlo con il puro Ruby, quanto segue è il modo più conciso che ho trovato (grazie a @ ulysse-bn per il miglioramento suggerito)

x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
    #=> "ThisShouldBeCamelCase"

Mi sento un po 'a disagio di aggiungere più risposte qui. Ho deciso di optare per l'approccio Ruby puramente leggibile e minimale, ignorando il bel benchmark di @ ulysse-bn. Mentre :class modalità :class è una copia di @ user3869936, la modalità :method non vedo in nessuna altra risposta qui.

  def snake_to_camel_case(str, mode: :class)
    case mode
    when :class
      str.split('_').map(&:capitalize).join
    when :method
      str.split('_').inject { |m, p| m + p.capitalize }
    else
      raise "unknown mode #{mode.inspect}"
    end
  end

Il risultato è:

[28] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :class)
=> "AsdDsaFds"
[29] pry(main)> snake_to_camel_case("asd_dsa_fds", mode: :method)
=> "asdDsaFds"

Sono arrivato qui cercando l'inverso della tua domanda, passando dal caso del cammello al caso del serpente. Usa il carattere di underscore per quello (non decolorare):

AppUser.name.underscore # => "app_user"

o, se hai già una stringa di cammello:

"AppUser".underscore # => "app_user"

o, se vuoi ottenere il nome della tabella, che probabilmente è il motivo per cui vorrai il caso del serpente:

AppUser.name.tableize # => "app_users"


Usa classify . Gestisce bene i casi limite.

"app_user".classify # => AppUser
"user_links".classify   # => UserLink

Nota:

Questa risposta è specifica per la descrizione fornita nella domanda (non è specifica per il titolo della domanda). Se si sta tentando di convertire una stringa in un caso di cammello, dovrebbero usare la risposta di Sergio . L'interrogante afferma che vuole convertire app_user in AppUser (non App_user ), quindi questa risposta ..





string