如何将Ruby类名(“NewUserBatch”)转换为带下划线的字符串(“NewUserBatch”)

如何将Ruby类名(“NewUserBatch”)转换为带下划线的字符串(“NewUserBatch”),ruby,string,class,Ruby,String,Class,我需要一种将类名转换为带下划线的小写的通用方法。例如,我希望将类名NewUserBatch转换为new\u user\u 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.acrony

我需要一种将类名转换为带下划线的小写的通用方法。例如,我希望将类名
NewUserBatch
转换为
new\u user\u 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

在简单的情况下,如果只有非名称空间的类名,则可以使用以下一行:

编辑:更新了积极的前瞻断言(谢谢@vladr)


这将查找紧跟在另一个字符后面的所有大写字符,然后再紧跟一个小写字符,在其前面插入下划线,然后将所有字符都降格。

还有一个很好的提示:要查找是否知道输入(NewUserBatch)和输出(new_user_batch),请使用以下方法

"NewUserBatch".find_method("new_user_batch") “NewUserBatch”。查找方法(“new\u user\u batch”)
太好了,我试着将
表格化
,但有一些问题,这似乎很有效!这在Rails控制台或irb上似乎不起作用;例如,
“REGGE”.gsub(/()([A-Z])/,“\1\u2')。downcase
最终成为
r\u eg\u ge
@Laas应该使用零宽度向前看或向后看断言,或者使其成为Rails的两次通过方式,请参见@oldergod的回复。
"MYRubyClassName".gsub(/(.)([A-Z](?=[a-z]))/,'\1_\2').downcase

# => "my_ruby_class_name"
"NewUserBatch".find_method("new_user_batch")