为什么这个简单的 ruby 代码在命令行中不起作用,但在将其粘贴到 irb 中时却起作用

Why this simple ruby code does not work in the commandline, but does when pasting it in irb

我有以下代码:

sample_code.rb

class Foo
  def bar
    Timeout.timeout(0.5){
        puts "Interupt this if it takes longer then 0.5 seconds"
    }
  end
end

foo = Foo.new()
foo.bar

当您将上面的示例粘贴到 irb 中时,上面的示例有效, 但是当你把它放在脚本中并且 运行 它像这样:

ruby ./sample_code.rb

会报如下错误

Traceback (most recent call last):
        1: from ./irb_works_ruby_dont.rb:11:in `<main>'
./irb_works_ruby_dont.rb:4:in `bar': uninitialized constant Foo::Timeout (NameError)

这是超时问题吗? irb 是否加载了一些正常的 ruby 命令不加载的模块?当 运行 作为脚本时如何使代码工作?

最可能的解释是 IRB 在启动 REPL 时需要超时 - 但您的脚本文件在此之前正在执行。您可以通过简单地要求它来修复它:

require 'timeout'

class Foo
  def bar
    Timeout.timeout(0.5){
        puts "Interupt this if it takes longer then 0.5 seconds"
    }
  end
end

foo = Foo.new
foo.bar