programing

문자열을 snake_case에서 Ruby의 CamelCase로 변환하는 중

powerit 2023. 6. 17. 09:47
반응형

문자열을 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

반응형