뱀 케이스에서 낙타 케이스로 이름을 변환하려고합니다. 내장 된 방법이 있습니까?
예 : "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 문자열 분류
Wayne Conrad의 코멘트보기
답변
Rails를 사용하는 경우을 사용하십시오 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"
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"
답변
순수한 루비 솔루션의 벤치 마크
순수한 루비 코드로 할 수있는 모든 가능성을 생각했습니다.
-
대문자와 gsub
'app_user'.capitalize.gsub(/_(\w)/){$1.upcase}
-
&
속기를 사용하여 분할 및 매핑 (user3869936의 답변 덕분에)'app_user'.split('_').map(&:capitalize).join
-
분할 및지도 (블랙 씨의 답변 덕분에)
'app_user'.split('_').map{|e| e.capitalize}.join
그리고 여기에이 모든 것들에 대한 벤치 마크가 있습니다. 나는 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"
답변
여기에 더 많은 답변을 추가하는 것이 약간 불편하다고 느낍니다. @ ulysse-bn의 멋진 벤치 마크를 무시하고 가장 읽기 쉽고 최소한의 순수한 루비 접근법을 사용하기로 결정했습니다. :class
mode는 @ 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"