当 gem 在 bundle exec 之外运行时,Ruby 未初始化常量错误

标签 ruby rubygems

我有一个从字符串创建 MD5 的简单 gem。

module SimpleMD5
  require 'digest/md5'

  def self.md5_string(string)
    Digest::MD5.hexdigest(string)
  end
end

运行 bundle exec bin/console 并调用该方法工作正常

需要'simple_md5'

SimpleMD5.md5_string('测试')

=> 098f6bcd4621d373cade4e832627b4f6

使用 IRB 控制台和上面的相同示例使用 rake buildrake install 构建 gem 后,我收到错误。

NameError:未初始化常量 SimpleMD5::Digest

构建 gem 时我是否遗漏了一个步骤?

最佳答案

你缺少模块定义,所以使用这个模式:

require 'digest/md5'

module SimpleMD5
  def md5_string(string)
    Digest::MD5.hexdigest(string)
  end

  extend self
end

SimpleMD5 名称不会自动生成,您必须在某处声明它。

此处 extend self 意味着您可以将模块与 include SimpleMD5 混合使用,也可以像在示例中那样直接使用它。

不要忘记两件事:在 Ruby 中,return 是隐式的,没有必要使用它,除非你提前退出你的函数,MD5 在 2016 年是一个非常糟糕的哈希算法。除非您使用它是为了向后兼容,请使用更好的东西,例如 SHA256 或 SHA512。

关于当 gem 在 bundle exec 之外运行时,Ruby 未初始化常量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36613279/

相关文章:

ruby-on-rails - `rescue_from` 格式为json时异常

ruby-on-rails - 更新 ruby​​gems 后 Ruby on Rails 出现错误 : "Failed to find gems [] >= 0"

ruby-on-rails - 将图像插入 ruby​​ 中的 pdf

ruby - 删除所有已安装的 Gem,特定版本除外

ruby-on-rails - 使用 WSL 时如何从 Windows 访问 Linux 二进制文件?

ruby-on-rails - 使用网络服务时缓存

ruby-on-rails - 此 IF 循环的最佳实践应被视为什么?

ruby-on-rails - 使用sqlite的Ruby on Rails,试图查询并返回最近7天的结果吗?

ruby-on-rails - 带有 native 扩展的MySQL2错误:无法构建gem native 扩展。 (Gem::Installer::ExtensionBuildError)

ruby-on-rails - Rubygems、Bundler 和 RVM 之间的关系