纯Ruby项目中Discord机器人QUESTIONS数据存储方式咨询
选Ruby文件还是YAML存储带正则的问题配置?
方案一:单独的Ruby文件存储
这应该是对你来说最省心的方案,完全适配你的场景:
- 优势:原生支持Ruby所有语法,正则直接写
/regex/即可,不需要额外处理。读取时只需require或load文件,就能直接使用QUESTIONS常量,和你平时写Ruby哈希完全一致,零学习成本。后续添加问题时,直接扩展哈希就行,还能灵活加注释、甚至写简单的动态逻辑(比如根据条件生成问题)。 - 实现示例:
新建config/questions.rb:
在Bot类中引入:QUESTIONS = { email: { content: '请输入你的邮箱', validator: /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i, invalid_input_message: '邮箱格式不正确,请重新输入' }, phone: { content: '请输入你的手机号', validator: /\A1[3-9]\d{9}\z/, invalid_input_message: '手机号格式不正确,请重新输入' } }require_relative 'config/questions' # 直接使用 QUESTIONS[:email][:validator] 即可
方案二:YAML存储+正则解析
YAML本身不支持原生正则,需要手动把字符串转成Ruby的Regexp对象,适合偏好简洁配置格式的场景:
- 优势:纯键值对结构更直观,通用性强,若后续需要和其他语言共享配置会更方便。
- 注意点:YAML中需要转义正则的特殊字符(比如反斜杠要写成
\\),且要额外写解析逻辑转换正则字符串。 - 实现示例:
新建config/questions.yml:
Ruby中读取并解析:email: content: '请输入你的邮箱' validator: '\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i' invalid_input_message: '邮箱格式不正确,请重新输入' phone: content: '请输入你的手机号' validator: '\A1[3-9]\d{9}\z' invalid_input_message: '手机号格式不正确,请重新输入'require 'yaml' raw_config = YAML.load_file('config/questions.yml') QUESTIONS = raw_config.transform_values do |item| # 拆分正则主体和修饰符 regex_content, modifiers = item['validator'].split('/').values_at(1, 2) # 转换为Regexp对象,处理修饰符 item['validator'] = if modifiers Regexp.new(regex_content, Regexp.const_get(modifiers.upcase)) else Regexp.new(regex_content) end # 可选:把字符串键转为符号键 item.symbolize_keys end
最终建议
作为个人副业项目,优先选单独的Ruby文件:
- 不需要额外的解析逻辑,减少出错概率;
- 你本身熟悉Ruby语法,写起来效率更高;
- 后期扩展灵活,能轻松添加动态逻辑。
只有当你特别偏好YAML的简洁格式,或有跨语言共享配置的潜在需求时,再考虑YAML方案。
内容的提问来源于stack exchange,提问作者Sonfaya
相关产品推荐
相关产品推荐

