Ruby 为什么config.ru中定义的顶级方法不能被Sinatra::Application访问?

Ruby 为什么config.ru中定义的顶级方法不能被Sinatra::Application访问?,ruby,sinatra,rack,Ruby,Sinatra,Rack,如果我有这样一个config.ru文件: def my_method 1+2 end require 'my_sinatra_app' run Sinatra::Application 从my_sinatra_app.rb中调用my_方法将返回“main:Object的未定义方法`my_方法”” 作为一种顶级方法,它应该可以从任何地方访问;为什么我的方法不能从my\u sinatra\u app.rb中访问?config.ru在Rack::Builder中定义了instance\u e

如果我有这样一个config.ru文件:

def my_method
  1+2
end

require 'my_sinatra_app'

run Sinatra::Application
从my_sinatra_app.rb中调用my_方法将返回“main:Object的未定义方法`my_方法”


作为一种顶级方法,它应该可以从任何地方访问;为什么我的方法不能从my\u sinatra\u app.rb中访问?

config.ru
Rack::Builder
中定义了
instance\u eval
,因此您在其中定义的方法不在顶级范围内。如果您想将它们作为顶级方法,可以尝试将它们放在另一个文件中,并从
config.ru
中将它们删除

exconfig.ru

p self # => #<Rack::Builder:0x1234123412 @ins=[]>

run lambda {|e|[200,{},[""]]}
p self=>#
运行lambda{e}[200,{},[“”]}

config.ru
instance\u eval
ed在
Rack::Builder
中,因此您在其中定义的方法不在顶级范围内。如果您想将它们作为顶级方法,可以尝试将它们放在另一个文件中,并从
config.ru
中将它们删除

exconfig.ru

p self # => #<Rack::Builder:0x1234123412 @ins=[]>

run lambda {|e|[200,{},[""]]}
p self=>#
运行lambda{e}[200,{},[“”]}

我认为您可以将其定义为一个模块:

module MyMethodsModule

  def self.my_method
    #Method body
  end

end
然后调用它的方法:

::MyMethodsModule.my_method

我认为您可以将其定义为一个模块:

module MyMethodsModule

  def self.my_method
    #Method body
  end

end
然后调用它的方法:

::MyMethodsModule.my_method

在你的应用程序中,你在哪里使用
my_method
?在config.ru和my_sinatra_app.rb的顶层(例如在configure…do块中),你在你的应用程序中在哪里使用
my_method
?在config.ru和my_sinatra_app.rb的顶层(例如在configure…do块中),谢谢。这就解释了让我困惑的行为。谢谢。这就解释了让我困惑的行为。这并不能直接回答我的问题,但我试过了(为了科学!),但它不起作用。非常奇怪。在Ruby 1.9.3和Sinatra(pre)中,它很乐意工作。我会再检查一遍。这并不能直接回答我的问题,但我试过了(为了科学!),但它不起作用。非常奇怪。在Ruby 1.9.3和Sinatra(pre)中,它很乐意工作。我再查一下。