我希望能够拥有一个可以require
所有常见依赖项的ruby文件,这样其他文件就可以在这个共享文件上只有一个require
。例如;我有 foo.rb 和 bar.rb 和 allrequires.rb 。我想在 foo.rb 和 bar.rb 中都有require "allrequires.rb"
行,但bar.rb
并不需要所有要求。
如果我在.rb文件中使用require
并不真正需要该文件,这是否重要?它可能对性能产生影响吗?
我目前正在ruby 1.8.7 (2010-08-16 patchlevel 302) [i386-mingw32]
在两个.rb文件中“共享”/使用所有需求似乎不是最好的主意。那将是什么解决方案?
现在我可以考虑在条件中使用文件名。
答案 0 :(得分:3)
有两个主要的性能惩罚:
require
本身所需的时间。在Ruby 1.9.1和Ruby 1.9.2中,执行所有require
所花费的时间比线性可伸缩性更糟糕 - 如果你将require
的数量增加一倍,它会花费你两倍多的时间很久 - 我认为这花了你四倍的时间。require
d文件中的代码所需的时间。如果您有类似以下的代码,那么执行代码将花费非常少的时间。class MyClass
MY_CONSTANT = File.read("data.txt")
end
答案 1 :(得分:1)
另一种条件要求的方法,下面的脚本在JSON解析器上没有错误,因为它名为require1.rb,在没有像script2.rb的require1.rb这样的名称的脚本中,不需要gem
require 'json' if "require1.rb, script2.rb"[File.basename(__FILE__)]
p File.basename(__FILE__)
text = '[{ "name" : "car", "status": "good"}, { "name" : "bus", "status": "bad"},{ "name" : "taxi", "status": "soso"},
{"noname":"", "status" : "worse"}
]'
data = JSON.parse(text)
p data.collect { |item| item['name'] }
编辑:这是一个使用数组的版本
["require1.rb","script1.rb"].find{|script|require 'json' if script===File.basename(__FILE__)}
答案 2 :(得分:0)
是的,会有一个快速扩展,你可以对mutch如何考虑是否真的重要。 有了多个需求,我就像这样把代码放在我的代码中,这样就不会占用太多的屏幕空间。
['green_shoes','Hpricot'].each(&method(:require))
你也可以做一个有条件的要求,但是你的代码周围会很难看
begin
data = JSON.parse(text)
rescue
require 'json_pure'
data = JSON.parse(text)
end
简而言之,给每个rb自己的需要
答案 3 :(得分:0)
我的最终解决方案是(如果有人发现它有用):
从web.rb或testweb.rb,rufus.rb或testrufus.rb调用requires.rb
called_from=caller[0].split(":")[0]
puts "loading web 'requires' for file: #{called_from} ..." if (["web"].any?{|s| called_from[s]})
puts "loading web 'requires' for file: #{called_from} ..." if (["rufus"].any?{|s| called_from[s]})
puts "loading web 'requires' for file: #{called_from} ..." if (["settings"].any?{|s| called_from[s]})
require 'rubygems'
require 'socket' if (["web","settings"].any?{|s| called_from[s]})
require 'ruby-growl' if (["web","settings","rufus"].any?{|s| called_from[s]})
require 'sinatra' if (["web"].any?{|s| called_from[s]})
感谢@Andrew的解释和@peter提示如何解决这个问题。