문자열을 snake_case에서 Ruby의 CamelCase로 변환하는 중
저는 이름을 뱀 케이스에서 낙타 케이스로 바꾸려고 합니다.내장된 방법이 있습니까?
예:"app_user"로."AppUser"
(나는 끈이 있습니다."app_user"저는 그것을 모델로 바꾸고 싶습니다.AppUser).
Rails를 사용하는 경우 String#camelize가 필요합니다.
"active_record".camelize # => "ActiveRecord"
"active_record".camelize(:lower) # => "activeRecord"
실제 클래스를 얻으려면 String#constantize를 사용해야 합니다.
"app_user".camelize.constantize
이것은 어떠세요?
"hello_world".split('_').collect(&:capitalize).join #=> "HelloWorld"
다음 설명에서 찾을 수 있습니다: Ruby 문자열 분류
레일을 사용하는 경우 사용classify가장자리 케이스를 잘 처리합니다.
"app_user".classify # => AppUser
"user_links".classify # => UserLink
참고:
이 답변은 질문에 지정된 설명에 한정됩니다(질문 제목에 한정되지 않음).문자열을 낙타 대소문자로 변환하려면 Sergio의 답변을 사용해야 합니다.질문자가 변환하고 싶다고 말합니다.app_user로.AppUser(아닙니다.App_user), 그러므로 이 대답은..
출처: http://rubydoc.info/gems/extlib/0.9.15/String#camel_case-instance_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"
그리고 소문자 변형의 경우:
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"
순수 Ruby 솔루션에 대한 벤치마크
저는 순수한 루비 코드로 그것을 하기 위해 모든 가능성을 염두에 두었습니다. 다음과 같습니다.
대문자와 소문자를 사용합니다.
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}사용하여 분할 및 매핑
&속기 (3869936 사용자의 답변 덕분)'app_user'.split('_').map(&:capitalize).join분할 및 지도(블랙 씨의 답변 덕분)
'app_user'.split('_').map{|e| e.capitalize}.join
여기 이 모든 것에 대한 벤치마크가 있습니다. 우리는 gsub이 이것에 매우 나쁘다는 것을 알 수 있습니다.저는 126080단어를 사용했습니다.
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"
여기에 답을 더 추가하기가 조금 불안합니다.@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"
루비 코어 자체는 스네이크 케이스에서 (위쪽) 카멜 케이스(파스칼 케이스라고도 함)로 문자열을 변환할 수 없습니다.
따라서 직접 구현하거나 기존의 보석을 사용해야 합니다.
lucky_case라는 작은 루비 보석이 있어 지원되는 10개 이상의 케이스에서 다른 케이스로 문자열을 쉽게 변환할 수 있습니다.
require 'lucky_case'
# to get upper camel case (pascal case) as string
LuckyCase.pascal_case('app_user') # => 'AppUser'
# to get the pascal case constant
LuckyCase.constantize('app_user') # => AppUser
# or the opposite way
LuckyCase.snake_case('AppUser') # => app_user
다음과 같은 경우 String 클래스에 원숭이 패치를 적용할 수도 있습니다.
require 'lucky_case/string'
'app_user'.pascal_case # => 'AppUser'
'app_user'.constantize # => AppUser
# ...
자세한 예제 및 문서는 공식 저장소를 참조하십시오.
https://github.com/magynhard/lucky_case
문자열을 확장하여 카멜라이즈 추가
순수한 루비에서는 레일즈에서 가져온 코드를 사용하여 문자열 클래스를 확장할 수 있습니다..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
여기에 나열된 다른 대부분의 방법은 레일에 따라 다릅니다.순수한 루비로 이 일을 하고 싶다면, 제가 생각해낸 가장 간결한 방법은 다음과 같습니다(제안된 개선에 대한 @ulysse-bn 덕분입니다).
x="this_should_be_camel_case"
x.gsub(/(?:_|^)(\w)/){$1.upcase}
#=> "ThisShouldBeCamelCase"
언급URL : https://stackoverflow.com/questions/9524457/converting-string-from-snake-case-to-camelcase-in-ruby
'programing' 카테고리의 다른 글
| 안드로이드 응용 프로그램에서 직접 Google Play Store를 여는 방법은 무엇입니까? (0) | 2023.06.17 |
|---|---|
| ASP.Net에서 상태 코드 500을 보내고 응답에 쓰는 방법은 무엇입니까? (0) | 2023.06.17 |
| 오라클에 null 값이 있는 열 합계 (0) | 2023.06.17 |
| Oracle SQL*Plus에서 LOB 열의 전체 내용을 표시하는 방법은 무엇입니까? (0) | 2023.06.17 |
| Typescript/JSX with React에서 화살표 기능이 있는 제네릭을 사용하는 방법은 무엇입니까? (0) | 2023.06.17 |