Câu trả lời:
Nếu bạn đang sử dụng Rails, String # camelize là thứ bạn đang tìm kiếm.
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
Nếu bạn muốn có được một lớp thực tế, bạn nên sử dụng Chuỗi # hằng số trên đầu trang đó.
"app_user".camelize.constantize
ruby-on-rails
, vì vậy, tôi đoán, nó không phải là một vấn đề. Nhưng cảm ơn đã đề cập.
#classify
thay thế. "some_namespace/module/class_name".classify => "SomeNamespace::Module::ClassName"
require "active_support/core_ext/string"
là đủ, cung cấp Rails đã được cài đặt.
Cái này thì sao?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
Tìm thấy trong các ý kiến ở đây: Phân loại chuỗi Ruby
Xem bình luận của Wayne Conrad
Nếu bạn sử dụng Rails, hãy sử dụng classify
. Nó xử lý các trường hợp cạnh tốt.
"app_user".classify # => AppUser
"user_links".classify # => UserLink
Ghi chú:
Câu trả lời này là cụ thể cho mô tả được đưa ra trong câu hỏi (nó không cụ thể cho tiêu đề câu hỏi). Nếu một người đang cố gắng chuyển đổi một chuỗi thành trường hợp lạc đà, họ nên sử dụng câu trả lời của Sergio . Người hỏi nói rằng anh ta muốn chuyển đổi app_user
thành AppUser
(không App_user
), do đó câu trả lời này ..
classify
trả về một chuỗi, bạn phải gọi constantize
sau đó để chuyển đổi nó thành một lớp thực tế.
classify
là các chuỗi số nhiều sẽ trở thành số ít ... 'age_in_years'.classify
trở thànhAgeInYear
4.2.11
Nguồn: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_method
Đối với mục đích học tập:
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"
Và đối với biến thể lowCase:
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
Tôi đã lấy mọi khả năng mà tôi có trong đầu để làm điều đó với mã ruby thuần túy, đây là:
viết hoa và gsub
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}
phân chia và lập bản đồ bằng cách sử dụng tốc &
ký (nhờ câu trả lời của user3869936)
'app_user'.split('_').map(&:capitalize).join
phân chia và bản đồ (nhờ câu trả lời của ông Black)
'app_user'.split('_').map{|e| e.capitalize}.join
Và đây là Điểm chuẩn cho tất cả những điều này, chúng ta có thể thấy rằng gsub khá tệ cho việc này. Tôi đã sử dụng 126 080 từ.
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)
Tôi đến đây để tìm kiếm câu hỏi ngược của bạn, từ trường hợp lạc đà đến trường hợp rắn. Sử dụng dấu gạch dưới cho điều đó (không khử màu):
AppUser.name.underscore # => "app_user"
hoặc, nếu bạn đã có một chuỗi trường hợp lạc đà:
"AppUser".underscore # => "app_user"
hoặc, nếu bạn muốn lấy tên bảng, đó có thể là lý do tại sao bạn muốn trường hợp rắn:
AppUser.name.tableize # => "app_users"
AppUser.table_name
? Bạn cũng sẽ đảm bảo có tên bảng thực sự nếu đó không phải là app_users, nhưng một cái gì đó được xác định ở nơi khác.
Tôi cảm thấy một chút khó chịu để thêm câu trả lời ở đây. Quyết định đi theo cách tiếp cận ruby tinh khiết dễ đọc và tối thiểu nhất, coi nhẹ điểm chuẩn đẹp từ @ ulysse-bn. Mặc dù :class
chế độ là bản sao của @ user3869936, nhưng :method
chế độ tôi không thấy trong bất kỳ câu trả lời nào khác ở đây.
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
Kết quả là:
[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
là một tập hợp con của CamelCase
. Ngoài ra đây là những gì tôi biết - trường hợp lạc đà áp dụng cho cả hai. Nhưng tôi chưa bao giờ điều tra. Cảm ơn vì đã đề cập đến PascalCase. vi.wikipedia.org/wiki/Camel_case
:method
phiên bản đã làm downcase
lần đầu tiên để nó có thể được sử dụng trên cả hai lower_snake_case
và UPPER_SNAKE_CASE
.
Hầu hết các phương pháp khác được liệt kê ở đây là Rails cụ thể. Nếu bạn muốn làm điều này với Ruby thuần túy, sau đây là cách ngắn gọn nhất mà tôi nghĩ ra (cảm ơn @ ulysse-bn vì sự cải tiến được đề xuất)
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
gsub
giải pháp của bạn , dường như chậm hơn so với map
giải pháp.
Trong Ruby thuần túy, bạn có thể mở rộng lớp chuỗi bằng cách sử dụng cùng một mã từ 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