我有一个从字符串创建 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 build
和 rake 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/