Відповіді:
Якщо ви використовуєте Rails, String # camelize - це те, що ви шукаєте.
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
Якщо ви хочете отримати власне клас, слід скористатися String # constantize поверх цього.
"app_user".camelize.constantize
ruby-on-rails
, так що, я думаю, це не проблема. Але дякую за згадування.
#classify
замість цього. "some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"
достатньо, якщо Rails вже встановлений.
Як щодо цього?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
Знайдено в коментарях тут: Класифікуйте рядок Ruby
Дивіться коментар Уейна Конрада
Якщо ви використовуєте Rails, використовуйте classify
. Він добре обробляє крайові корпуси.
"app_user".classify # => AppUser
"user_links".classify # => UserLink
Примітка:
Ця відповідь є специфічною для опису, даного у запитанні (він не специфічний для назви питання). Якщо хтось намагається перетворити рядок у верблюд, він повинен відповісти Серхіо . Допитуючий заявляє, що хоче перейти app_user
на AppUser
(не App_user
), звідси ця відповідь.
classify
повертаючи рядок, вам доведеться зателефонувати constantize
потім, щоб перетворити її у фактичний клас.
classify
є те, що 'age_in_years'.classify
AgeInYear
4.2.11
Джерело: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instan_method
З метою навчання:
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"
А для нижнього варіантуCase:
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
Я скористався всіма можливостями, які мав на увазі, щоб зробити це за допомогою чистого рубінового коду, ось вони:
капіталізувати і gsub
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}
розділити та &
скласти карту за допомогою скорочення (завдяки відповіді користувача3869936)
'app_user'.split('_').map(&:capitalize).join
розділити та скласти карту (завдяки відповіді містера Блека)
'app_user'.split('_').map{|e| e.capitalize}.join
І ось Оцінка для всього цього, ми можемо бачити, що gsub для цього досить поганий. Я використав 126 080 слів.
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)
Я прийшов сюди шукати зворотне запитання, переходячи від справи верблюда до справи зі змією. Використовуйте для цього підкреслення (не декамеруйте):
AppUser.name.underscore # => "app_user"
або, якщо у вас вже є рядок із верблюда:
"AppUser".underscore # => "app_user"
або, якщо ви хочете отримати назву таблиці, імовірно, саме тому ви хочете, щоб справа з змією:
AppUser.name.tableize # => "app_users"
AppUser.table_name
? Ви також забезпечите справжнє ім’я таблиці, якщо це не app_users, а щось визначене в іншому місці.
Мені трохи неприємно додавати сюди більше відповідей. Вирішив піти на найбільш читаний і мінімально чистий рубіновий підхід, не зважаючи на приємний орієнтир від @ ulysse-bn. Хоча :class
режим є копією @ user3869936, :method
режим я не бачу в жодній іншій відповіді.
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
Результат:
[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
, що це підмножина CamelCase
. І це те, що я знав, - той випадок верблюда стосувався обох. Але я ніколи не досліджував. Дякуємо, що згадали про PascalCase. en.wikipedia.org/wiki/Camel_case
:method
версія зробила downcase
першу, щоб її можна було використовувати і на, lower_snake_case
і на UPPER_SNAKE_CASE
.
Більшість інших перерахованих тут методів характерні для Rails. Якщо ви хочете зробити це за допомогою чистого Ruby, наступний спосіб є найбільш стислим способом, який я придумав (завдяки @ ulysse-bn за запропоноване вдосконалення)
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsub
рішення, схоже, це повільніше порівняно з map
рішенням.
У чистому Ruby ви можете розширити клас рядків, використовуючи точно такий же код від 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