开发者

already initialized constant, and required twice

开发者 https://www.devze.com 2023-04-11 08:35 出处:网络
Hi, all, i think this is a bug about the constant defined in sinatra, let\'s look my code. route.rb require \'sinatra\'

Hi, all, i think this is a bug about the constant defined in sinatra, let's look my code.

route.rb

require 'sinatra'

get '/' do
        C = "this is a test for constant"
        "Hello World!"
end

Gemfile

source 'http://rubygems.org'
gem 'rack'
gem 'sinatra'

config.ru

require './route'
run Sinatra::Application

Starting the web server, we will see the below

$ rackup 
[2011-10-08 19:54:36] INFO  WEBrick 1.3.1
[2011-10-08 19:54:36] INFO  ruby 1.9.2 (2011-07-09) [i686-linux]
[2011-10-08 19:54:36] INFO  WEBrick::HTTPServer#start: pid=3268 port=9292
127.0.0.1 - - [08/Oct/2011 19:54:42] "GET / HTTP/1.1" 200 25 0.0059
127.0.0.1 - - [08/Oct/2011 19:54:42] "GET / HTTP/1.1" 200 25 0.0142
/home/zcdny/repo/test/route.rb:4: warning: already initialized constant C
127.0.0.1 - - [08/Oct/2011 19:54:43] "GET / HTTP/1.1" 200 25 0.0094
127.0.0.1 - - [08/Oct/2011 19:54:43] "GET / HTTP/1.1" 200 25 0.0098
/home/z开发者_如何学运维cdny/repo/test/route.rb:4: warning: already initialized constant C
127.0.0.1 - - [08/Oct/2011 19:54:55] "GET / HTTP/1.1" 200 25 0.0003
127.0.0.1 - - [08/Oct/2011 19:54:55] "GET / HTTP/1.1" 200 25 0.0006
/home/zcdny/repo/test/route.rb:4: warning: already initialized constant C
127.0.0.1 - - [08/Oct/2011 19:54:56] "GET / HTTP/1.1" 200 25 0.0003
127.0.0.1 - - [08/Oct/2011 19:54:56] "GET / HTTP/1.1" 200 25 0.0005

Eidt

Fixing the file route.rb

require 'sinatra'

configure do
        C = "this is a test for constant"
end

get '/' do
        "Hello World!"
end

Now, the server no longer warning the constant be initialized. But the log of server still appears double 'GET' require , i just want it requires for one to every client required, that is my question, How to solve it.

Thanks in advance.


What's wrong about that? If you define the constant twice (which happens if you have two GET requests or a GET and a HEAD request) then that warning will be displayed. You global variables instead. But if you don't have to, try to avoid global state at all cost, otherwise you might run in architectural issues (what if you want to serve more endpoints and globals clash) and make it hard to scale: if you rely on the internal state of a process, will you be able to serve the website from two processes? what about two machines?

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号