为什么我使用 Ruby 2.6.3 在 irb 中得到 Dir:Class 的未定义方法“mktmpdir”?

Why do I get undefined method `mktmpdir' for Dir:Class in irb using Ruby 2.6.3?

https://ruby-doc.org/stdlib-2.6.3/libdoc/tmpdir/rdoc/Dir.html 包含有关 Dir class.

mktmpdir 方法的描述

mktmpdir(prefix_suffix=nil, *rest)
::mktmpdir creates a temporary directory.

我们有一个正在使用该应用程序但没有任何错误的应用程序,但为什么无法在控制台/irb 中 运行 它?为什么 hack 在控制台中不起作用?我也用 Dir.new ... 进行了测试,低于我对 Dir.mktmpdir 的尝试。

irb(main):010:0> Dir.mktmpdir {|dir| dir is ".../d..." }
Traceback (most recent call last):
        5: from C:/Ruby26/bin/irb.cmd:31:in `<main>'
        4: from C:/Ruby26/bin/irb.cmd:31:in `load'
        3: from C:/Ruby26/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        2: from (irb):10
        1: from (irb):10:in `rescue in irb_binding'
NoMethodError (undefined method `mktmpdir' for Dir:Class)

Dir.methods 没有显示这个方法,只有 mkdir。为什么它是文档的一部分,它是如何工作的?

分别缺少什么导致此行为的原因是什么?

您将标准库中 tmpdir 添加的 Dir class 补丁与核心中未打补丁的 Dir class 混淆了.如果您查看 tmpdir 包的文档:

https://ruby-doc.com/stdlib/libdoc/tmpdir/rdoc/Dir.html

然后你会在路径中找到 Dir.mktmpdir(注意 stdlib/libdoc/tmpdir)。但是如果我们在 core:

中查看 Dir

https://ruby-doc.org/core/Dir.html

您会找到所有常用的 class 方法(chdirchroot、...)但没有 mktmpdir.

如果你想使用 mktmpdir 那么你必须 require 'tmpdir':

Dir.method(:mktmpdir)
# NameError (undefined method `mktmpdir' for class `#<Class:Dir>')

require 'tmpdir'
Dir.method(:mktmpdir)
# #<Method: Dir.mktmpdir>