Existe alguma função pronta que converte Strings de caixa de camelo em string separada por sublinhado?
Eu quero algo como isto:
"CamelCaseString".to_underscore
para retornar "camel_case_string".
...
Existe alguma função pronta que converte Strings de caixa de camelo em string separada por sublinhado?
Eu quero algo como isto:
"CamelCaseString".to_underscore
para retornar "camel_case_string".
...
Respostas:
O ActiveSupport do Rails adiciona sublinhado à String usando o seguinte:
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
Então você pode fazer coisas divertidas:
"CamelCase".underscore
=> "camel_case"
tr("-","_")para tr("- ","_")(espaço adicionado ao primeiro parâmetro), isso também transformará espaços em sublinhados. Além disso, acho que você nem precisa incluir self., ou pelo menos funciona para mim no Ruby 1.9.3.
require 'active_support/core_ext/string'
Você pode usar
"CamelCasedName".tableize.singularize
Ou apenas
"CamelCasedName".underscore
Ambas as opções irão render "camel_cased_name". Você pode conferir mais detalhes aqui .
Implementação Ruby de uma linha:
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
assim "SomeCamelCase".to_underscore # =>"some_camel_case"
/([^A-Z])([A-Z]+)/, em vez disso, manipular "ALLCAPS"-> em "allcaps"vez de"a_ll_ca_ps"
Existe um método embutido do Rails chamado 'underscore' que você pode usar para esse fim
"CamelCaseString".underscore #=> "camel_case_string"
O método 'sublinhado' pode normalmente ser considerado como inverso de 'camelize'
Aqui está como o Rails faz isso :
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
Receptor convertido em caso de cobra: http://rubydoc.info/gems/extlib/0.9.15/String#snake_case-instance_method
Esta é a biblioteca de suporte do DataMapper e Merb. ( http://rubygems.org/gems/extlib )
def snake_case
return downcase if match(/\A[A-Z]+\z/)
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
gsub(/([a-z])([A-Z])/, '\1_\2').
downcase
end
"FooBar".snake_case #=> "foo_bar"
"HeadlineCNNNews".snake_case #=> "headline_cnn_news"
"CNN".snake_case #=> "cnn"
Confira o caso de cobras do Ruby Facets
Os seguintes casos são tratados, como mostrado abaixo:
"SnakeCase".snakecase #=> "snake_case"
"Snake-Case".snakecase #=> "snake_case"
"Snake Case".snakecase #=> "snake_case"
"Snake - Case".snakecase #=> "snake_case"
De: 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
"Dumb Penguin's Egg".snakecase # => "dumb_penguin's_egg"
Oneliner curto para CamelCases quando você tem espaços também incluídos (não funciona corretamente se você tiver uma palavra entre letras pequenas e iniciais):
a = "Test String"
a.gsub(' ', '').underscore
=> "test_string"
underscorenão faz parte do ruby #
Caso alguém procure um caso em que ele precise aplicar sublinhado a string com espaços e desejar convertê-los em sublinhados, você pode usar algo como isto
'your String will be converted To underscore'.parameterize.underscore
#your_string_will_be_converted_to_underscore
Ou apenas use .parameterize ('_'), mas lembre-se de que este está obsoleto
'your String will be converted To underscore'.parameterize('_')
#your_string_will_be_converted_to_underscore
Eu gostaria deste:
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
Remendo de macaco da Stringclasse. Há turmas que começam com duas ou mais letras em maiúsculas.
"\1_\2"para o '\1_\2'contrário, em "came\u0001_\u0002ase"vez "camel_case"de usar o Ruby 2.5 ... talvez outros também.