Réponses:
Si vous utilisez Rails, String # camelize est ce que vous recherchez.
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
Si vous voulez obtenir une classe réelle, vous devez utiliser String # constantize en plus de cela.
"app_user".camelize.constantize
ruby-on-rails, donc, je suppose, ce n'est pas un problème. Mais merci de l'avoir mentionné.
#classifyplutôt. "some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"suffit, à condition que Rails soit déjà installé.
Celui-ci, ça va?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
Trouvé dans les commentaires ici: Classifier une chaîne Ruby
Voir le commentaire de Wayne Conrad
Si vous utilisez des rails, utilisez classify. Il gère bien les boîtiers de bord.
"app_user".classify # => AppUser
"user_links".classify # => UserLink
Remarque:
Cette réponse est spécifique à la description donnée dans la question (elle n'est pas spécifique au titre de la question). Si quelqu'un essaie de convertir une chaîne en cas de chameau, il doit utiliser la réponse de Sergio . Le questionneur déclare qu'il veut se convertir app_useren AppUser(non App_user), d'où cette réponse.
classifyrenvoie une chaîne, vous devez l'appeler constantizepar la suite pour la convertir en classe réelle.
classifyest que les chaînes au pluriel deviendront singulières ... 'age_in_years'.classifydevientAgeInYear
4.2.11
Source: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method
À des fins d'apprentissage:
class String
def camel_case
return self if self !~ /_/ && self =~ /[A-Z]+.*/
split('_').map{|e| e.capitalize}.join
end
end
"foo_bar".camel_case #=> "FooBar"
Et pour la variante lowerCase:
class String
def camel_case_lower
self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
end
end
"foo_bar".camel_case_lower #=> "fooBar"
self.split('_').inject([]){ |buffer,e| buffer + [buffer.empty? ? e : e.capitalize] }.join
J'ai pris toutes les possibilités que j'avais en tête pour le faire avec du code ruby pur, les voici:
capitaliser et gsub
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}diviser et cartographier en utilisant la &sténographie (grâce à la réponse de user3869936)
'app_user'.split('_').map(&:capitalize).joindiviser et cartographier (grâce à la réponse de M. Black)
'app_user'.split('_').map{|e| e.capitalize}.joinEt voici le Benchmark pour tout cela, nous pouvons voir que gsub est assez mauvais pour cela. J'ai utilisé 126080 mots.
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)
Je suis arrivé ici à la recherche de l'inverse de votre question, passant de l'étui de chameau à l'étui de serpent. Utilisez un trait de soulignement pour cela (pas décaméliser):
AppUser.name.underscore # => "app_user"
ou, si vous avez déjà une chaîne de casse camel:
"AppUser".underscore # => "app_user"
ou, si vous voulez obtenir le nom de la table, c'est probablement pourquoi vous voudriez le cas du serpent:
AppUser.name.tableize # => "app_users"
AppUser.table_name? Vous vous assurerez également d'avoir le vrai nom de la table si ce n'est pas app_users, mais quelque chose de défini ailleurs.
Je me sens un peu mal à l'aise d'ajouter plus de réponses ici. Décidé d'opter pour l'approche de rubis pur la plus lisible et la plus minimale, sans tenir compte de la belle référence de @ ulysse-bn. Alors que le :classmode est une copie de @ user3869936, le :methodmode que je ne vois dans aucune autre réponse ici.
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
Le résultat est:
[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"
PascalCasesont un sous-ensemble de CamelCase. C'est aussi ce que je savais - cette affaire de chameau s'appliquait aux deux. Mais je n'ai jamais enquêté. Merci d'avoir mentionné PascalCase. en.wikipedia.org/wiki/Camel_case
:methodversion faisait une downcasepremière pour pouvoir être utilisée à la fois sur lower_snake_caseet UPPER_SNAKE_CASE.
La plupart des autres méthodes répertoriées ici sont spécifiques à Rails. Si vous voulez faire cela avec pur Ruby, voici la méthode la plus concise que j'ai trouvée (merci à @ ulysse-bn pour l'amélioration suggérée)
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsubsolution il semble qui est plus lente que la mapsolution.
En Ruby pur, vous pouvez étendre la classe de chaînes en utilisant exactement le même code de Rails .camelize
class String
def camelize(uppercase_first_letter = true)
string = self
if uppercase_first_letter
string = string.sub(/^[a-z\d]*/) { |match| match.capitalize }
else
string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { |match| match.downcase }
end
string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub("/", "::")
end
end