如何将Ruby类名称(“Net User Batch”)转换为带下划线的字符串(“new_user batch”)

时间:2012-10-18 09:01:40

标签: ruby string class

我需要一种通用的方法将类名转换为带有下划线的小写。例如,我希望将类名NewUserBatch转换为new_user_batch。怎么做?

3 个答案:

答案 0 :(得分:7)

Underscore

>> 'NewUserBatch'.underscore
=> "new_user_batch"

它包含在Rails中,因此如果您不使用它,可以参考其源代码。

def underscore(camel_cased_word)
  word = camel_cased_word.to_s.dup
  word.gsub!(%r::/, '/')
  word.gsub!(%r(?:([A-Za-z\d])|^)(#{inflections.acronym_regex})(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
  word.gsub!(%r([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
  word.gsub!(%r([a-z\d])([A-Z])/,'\1_\2')
  word.tr!("-", "_")
  word.downcase!
  word
end

答案 1 :(得分:2)

在简单的情况下,只有非命名空间类名称,您可以使用此oneliner:

编辑更新了积极的前瞻声明(感谢@vladr)

"MYRubyClassName".gsub(/(.)([A-Z](?=[a-z]))/,'\1_\2').downcase

# => "my_ruby_class_name"

这会找到跟随另一个char的所有大写字符,然后是一个小写字母char,在它之前插入下划线然后下调所有内容。

答案 2 :(得分:0)

另外一个很好的提示:找到你是否知道INPUT(NewUserBatch)和OUTPUT(new_user_batch)使用以下方法

"NewUserBatch".find_method("new_user_batch")