3

我希望能够拥有一个包含require所有常见依赖项的 ruby​​ 文件,以便其他文件可以require在此共享文件上只有一个。例如;我有foo.rbbar.rballrequires.rb。我想require "allrequires.rb"foo.rbbar.rb中都有这条线,但bar.rb不需要所有要求。

如果我require在不需要该文件的 .rb 文件中使用它有关系吗?它可能会对性能产生影响吗?

我目前在ruby 1.8.7 (2010-08-16 patchlevel 302) [i386-mingw32]

更新

看起来在两个 .rb 文件中“共享”/使用所有要求并不是最好的主意。有什么解决办法呢?

现在我可以考虑在条件中使用文件名。

4

4 回答 4

3

有两个主要的性能惩罚:

  1. 自己做的时间require。在 Ruby 1.9.1 和 Ruby 1.9.2 中,完成所有requires 所花费的时间比线性可伸缩性更差——如果你将requires 的数量增加一倍,它花费的时间是你的两倍多——我认为它花费了你四倍的时间长。
  2. 执行文件中的代码所花费的时间为required。如果您有如下代码,那么执行代码将花费大量时间。
class MyClass
  MY_CONSTANT = File.read("data.txt")
end
于 2012-05-15T23:27:14.917 回答
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__)}
于 2012-05-16T10:08:48.407 回答
0

是的,将会有一个速度分析,如果它真的很重要,你可以基准如何考虑。有了多个要求,我像这样将下摆放在我的代码中,这样它就不会占用太多屏幕空间。

['green_shoes','Hpricot'].each(&method(:require))

你也可以做一个有条件的要求,但是在你的代码周围会很难看

begin
  data = JSON.parse(text)
rescue
  require 'json_pure' 
  data = JSON.parse(text)
end

所以简而言之,给每个 rb 自己的要求

于 2012-05-16T09:59:53.137 回答
0

我的最终解决方案是(以防有人发现它有用):

requires.rb 从 web.rb 或 testweb.rb、rufus.rb 或 testrufus.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 的提示如何解决这个问题。

于 2012-05-23T00:28:41.437 回答