Antworten:
Wenn Sie Rails verwenden, ist String # camelize genau das, wonach Sie suchen.
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
Wenn Sie eine tatsächliche Klasse erhalten möchten, sollten Sie darüber hinaus String # constize verwenden .
"app_user".camelize.constantize
ruby-on-rails
, also ist es wohl kein Problem. Aber danke fürs Erwähnen.
#classify
stattdessen. "some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"
ist ausreichend, sofern Rails bereits installiert ist.
Wie wäre es mit diesem?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
In den Kommentaren hier zu finden: Klassifizieren Sie eine Ruby-Zeichenfolge
Siehe Kommentar von Wayne Conrad
Wenn Sie Rails verwenden, verwenden Sie classify
. Es handhabt Randfälle gut.
"app_user".classify # => AppUser
"user_links".classify # => UserLink
Hinweis:
Diese Antwort ist spezifisch für die Beschreibung in der Frage (sie ist nicht spezifisch für den Fragentitel). Wenn man versucht, einen String in einen Kamelkasten umzuwandeln, sollte man Sergios Antwort verwenden. Der Fragesteller gibt an, dass er app_user
zu AppUser
(nicht App_user
) konvertieren möchte , daher diese Antwort.
classify
eine Zeichenfolge zurückgegeben wird, die Sie anschließend aufrufen müssen constantize
, um sie in eine tatsächliche Klasse zu konvertieren.
classify
ist, dass pluralisierte Saiten singulär werden ... 'age_in_years'.classify
werdenAgeInYear
4.2.11
Quelle: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method
Zu Lernzwecken:
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"
Und für die LowerCase-Variante:
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
Ich habe alle Möglichkeiten genutzt, um dies mit reinem Ruby-Code zu tun. Hier sind sie:
kapitalisieren und gsub
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}
&
Teilen und Zuordnen mit Kurzschrift (dank der Antwort von user3869936)
'app_user'.split('_').map(&:capitalize).join
Split und Map (dank Mr. Blacks Antwort)
'app_user'.split('_').map{|e| e.capitalize}.join
Und hier ist der Benchmark für all dies. Wir können sehen, dass gsub dafür ziemlich schlecht ist. Ich habe 126 080 Wörter verwendet.
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)
Ich bin hierher gekommen, um die Umkehrung Ihrer Frage zu suchen, von Kamelfall zu Schlangenfall. Verwenden Sie dazu einen Unterstrich (nicht dekamellisieren):
AppUser.name.underscore # => "app_user"
oder, wenn Sie bereits eine Kamelfallschnur haben:
"AppUser".underscore # => "app_user"
oder, wenn Sie den Tabellennamen erhalten möchten, weshalb Sie wahrscheinlich den Schlangenfall möchten:
AppUser.name.tableize # => "app_users"
AppUser.table_name
? Sie werden auch sicherstellen, dass der wahre Tabellenname vorhanden ist, wenn es sich nicht um app_users handelt, sondern um etwas, das an anderer Stelle definiert ist.
Es ist mir etwas unangenehm, hier weitere Antworten hinzuzufügen. Beschlossen, den lesbarsten und minimalsten reinen Rubin-Ansatz zu wählen, ohne den netten Benchmark von @ ulysse-bn zu berücksichtigen. Während der :class
Modus eine Kopie von @ user3869936 ist, sehe :method
ich den Modus hier in keiner anderen Antwort.
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
Ergebnis ist:
[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"
PascalCase
ist eine Teilmenge von CamelCase
. Auch das wusste ich - dieser Kamelfall galt für beide. Aber ich habe nie nachgeforscht. Vielen Dank, dass Sie PascalCase erwähnt haben. en.wikipedia.org/wiki/Camel_case
:method
Version ein tat downcase
zunächst so auf beide verwendet werden können , lower_snake_case
und UPPER_SNAKE_CASE
.
Die meisten anderen hier aufgeführten Methoden sind Rails-spezifisch. Wenn Sie dies mit reinem Ruby tun möchten, ist das Folgende die prägnanteste Methode, die ich mir ausgedacht habe (danke an @ ulysse-bn für die vorgeschlagene Verbesserung).
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsub
Lösung, die im Vergleich zur map
Lösung langsamer zu sein scheint .
In reinem Ruby können Sie die Zeichenfolgenklasse mit genau demselben Code aus Rails erweitern .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