在Rails中从类名字符串动态提取指定子串的方法
动态提取类名中的通知类型部分
方案:使用正则表达式匹配
不管前缀的命名空间是::Pos::、Pos::还是其他任意形式,只要类名后缀是Notice,都可以用正则精准提取中间的类型部分:
class_name = '::Pos::EmailNotice' # 可替换为任意目标字符串 type = class_name.match(/(\w+)Notice$/)[1] # 输出: "Email" # 对所有示例输入都有效: # 'Pos::EmailNotice' → "Email" # '::Pos::CallNotice' → "Call" # 'Pos::CallNotice' → "Call"
为什么这个方案更动态?
- 不依赖固定的命名空间前缀(比如
Pos::),不管前缀是单层、多层还是带前置::,都能正常提取 - 只要新增的通知类型遵循
XXXNotice的命名规则,无需修改代码就能自动适配 - 相比
slice/delete_prefix这类硬编码前缀的方法,扩展性更强
容错处理(可选)
如果担心输入不符合格式导致报错,可以加个判断:
if match = class_name.match(/(\w+)Notice$/) type = match[1] else type = 'Unknown' # 或其他自定义默认值 end
内容的提问来源于stack exchange,提问作者Donslaught
相关产品推荐
相关产品推荐

