Dönüştürme deve vaka ruby ​​case içinde ruby


232

Deve kasası dizelerini alt çizgi ayrılmış dizeye dönüştüren herhangi bir hazır fonksiyon var mı?

Böyle bir şey istiyorum:

"CamelCaseString".to_underscore      

"camel_case_string" döndürmek için.

...


43
Bilginize: küçük harf ve alt çizgi yılan resmi olarak "resmen" denir
Andrew

3
"Resmi olarak" tırnak işaretleri içinde görmek garip ama yine de bunu tanımlamanın en iyi yolu bu.
stevenspiel

Nedense snakecase yönteminin eksik olduğunu görüyorum. Raylar 4.
Abram

Yanıtlar:


362

Rails ActiveSupport , aşağıdakileri kullanarak Dizeye alt çizgi ekler:

class String
  def underscore
    self.gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr("-", "_").
    downcase
  end
end

Sonra eğlenceli şeyler yapabilirsiniz:

"CamelCase".underscore
=> "camel_case"

5
Eğer değiştirirseniz tr("-","_")için tr("- ","_")(ilk param eklenen boşluk), bu da alt çizgi içine boşluk dönecek. Ayrıca, eklemeniz bile gerektiğini sanmıyorum self., ya da en azından benim için Ruby 1.9.3 altında çalışıyor.
Gus Shortz

6
require 'active_support/core_ext/string'
konsolebox

Alt çizgi fonksiyonu Etkin kullanımlar: github.com/rails/rails/blob/…
GreeKatrina

alt çizgi, rayların yakut olmayan yöntemidir, bkz. apidock.com/rails/String/underscore .
S.Yadav

1
@ S.Yadav doğru yöntem bir Rails yani varsayılan olarak alt çizgi çağıramazsınız, ancak kullanılan kodu sağlayarak ve rayları kaynak olarak göstererek bu cevap yakut için iyi bir yanıttır, raylar ekleyebileceğinizi veya sadece raylar ekibinin yazdığı ve test ettiği bu işlevi içerir.
Michael Gorman

99

Kullanabilirsiniz

"CamelCasedName".tableize.singularize

Ya da sadece

"CamelCasedName".underscore

Her iki seçenek de verilecektir "camel_cased_name". Burada daha ayrıntılı bilgi kontrol edebilirsiniz burada .


11
Bu, ActiveSupport :: Inflector uygulamasının bir parçasıdır, onsuz bu String uzantılarını kullanamazsınız (salt irb konsolunda deneyin: "ThisCamelCaseString" .underscore, sonra 'active_support / inflector' gerektirir ve tekrar deneyin)
Evgenia Manolova

3
OP etiketi "raylar üzerinde yakut" diyor
Julien Lamarche

55

Tek katmanlı Ruby uygulaması:

class String
   # ruby mutation methods have the expectation to return self if a mutation occurred, nil otherwise. (see http://www.ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21)
   def to_underscore!
     gsub!(/(.)([A-Z])/,'\1_\2')
     downcase!
   end

   def to_underscore
     dup.tap { |s| s.to_underscore! }
   end
end

Yani "SomeCamelCase".to_underscore # =>"some_camel_case"


2
diğer çözümler nasıl saf yakut değil?
jrhicks

Oh, sh ... Teşekkürler - Yazmakla okumaktan çok ilgimi çekiyordu. Sonuç olarak - Rails bağlantıları bana diğer snippet'lerin Rails'e özgü olduğunu düşündürdü. Cevap değişti ...
kirushik

1
düzenlememde başka bir hata var ve düzeltebileceğim görünmüyor. Düzeltilmiş kod: gist.github.com/4027440
Tim Harper

6
Bunun /([^A-Z])([A-Z]+)/yerine, "ALLCAPS""allcaps""a_ll_ca_ps"
Nevir

4
Bu aslında 10 astarlı!
kristianp

30

Bu amaçla kullanabileceğiniz 'alt çizgi' adı verilen bir Rails dahili yöntemi vardır.

"CamelCaseString".underscore #=> "camel_case_string" 

'Alt çizgi' yöntemi tipik olarak 'deve' ifadesinin tersi olarak düşünülebilir


1
"..." için undefined yöntemi `` undercore '': String
Dorian

5
Bu bir ActiveSupport yöntemidir
Dorian

20

İşte nasıl Raylar yapar :

   def underscore(camel_cased_word)
     camel_cased_word.to_s.gsub(/::/, '/').
       gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
       gsub(/([a-z\d])([A-Z])/,'\1_\2').
       tr("-", "_").
       downcase
   end

1
Core String sınıfını istila etmek yerine operandın yöntem bağımsız değişkeni olması daha iyidir.
Pistos

1
Kabul etmeyin - olması gerektiği gibi sınıfta çalışması daha iyi, yoksa başka bir şekilde bir modüle yapıştırmanız ve ihtiyacınız olan her yere dahil etmeyi unutmayın.
Ghoti

1
Ayrıca bu yöntem Rails 3 dizeleri zaten bir parçasıdır :)
Ghoti

2
Ben bu tartışmaya atlamak eğer - Daha iyi = = eklediğinizde string sınıfını istila olması.
Evan Moran


7

Check out snakecase gelen Yakut YÖNÜ

Aşağıdaki durumlar, aşağıda görüldüğü gibi ele alınmaktadır:

"SnakeCase".snakecase         #=> "snake_case"
"Snake-Case".snakecase        #=> "snake_case"
"Snake Case".snakecase        #=> "snake_case"
"Snake  -  Case".snakecase    #=> "snake_case"

Gönderen: https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/snakecase.rb

class String

  # Underscore a string such that camelcase, dashes and spaces are
  # replaced by underscores. This is the reverse of {#camelcase},
  # albeit not an exact inverse.
  #
  #   "SnakeCase".snakecase         #=> "snake_case"
  #   "Snake-Case".snakecase        #=> "snake_case"
  #   "Snake Case".snakecase        #=> "snake_case"
  #   "Snake  -  Case".snakecase    #=> "snake_case"
  #
  # Note, this method no longer converts `::` to `/`, in that case
  # use the {#pathize} method instead.

  def snakecase
    #gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr('-', '_').
    gsub(/\s/, '_').
    gsub(/__+/, '_').
    downcase
  end

  #
  alias_method :underscore, :snakecase

  # TODO: Add *separators to #snakecase, like camelcase.

end

Özel karakterli bir dize ile çalışmaz. Örn:"Dumb Penguin's Egg".snakecase # => "dumb_penguin's_egg"
khiav reoy

6

Boşlukları da dahil ettiğinizde CamelCases için kısa oneliner (küçük bir başlangıç ​​harfiyle aralarında bir kelime varsa doğru çalışmaz):

a = "Test String"
a.gsub(' ', '').underscore

  => "test_string"

1
underscoreRuby'nin bir parçası değil
dft

4

Birisinin boşluklu dizeye alt çizgi uygulaması gerektiğinde ve alt çizgilere dönüştürmek istediği durumda durum arayan bir kişi varsa, bunun gibi bir şey kullanabilirsiniz

'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore

Veya sadece .parameterize ('_') kullanın ancak bunun kullanımdan kaldırıldığını unutmayın

'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore

1

Bunu isterdim:

class String

  # \n returns the capture group of "n" index
  def snikize
    self.gsub(/::/, '/')
    .gsub(/([a-z\d])([A-Z])/, "\1_\2")
    .downcase
  end

  # or

  def snikize
    self.gsub(/::/, '/')
    .gsub(/([a-z\d])([A-Z])/) do
      "#{$1}_#{$2}"
    end
    .downcase
  end

end

Maymun yama Stringsınıfı. Büyük harfle iki veya daha fazla harfle başlayan sınıf vardır.


Sen değişikliğine ihtiyaç "\1_\2"için '\1_\2'aksi takdirde ile bitireceğiz "came\u0001_\u0002ase"yerine "camel_case"Ruby 2.5 itibariyle ... belki diğerleri de.
6ft Dan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.