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

时间:2016-04-14 03:19:27

标签: ruby rubygems

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

module SimpleMD5
  require 'digest/md5'

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

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

require 'simple_md5'

SimpleMD5.md5_string('test')

=> 098f6bcd4621d373cade4e832627b4f6

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

NameError: uninitialized constant SimpleMD5::Digest

建造宝石时我错过了一步吗?

1 个答案:

答案 0 :(得分:1)

您错过了模块定义,因此请使用以下模式:

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。