没有必要要求吗?

时间:2012-05-15 22:41:10

标签: ruby require

我希望能够拥有一个可以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文件中“共享”/使用所有需求似乎不是最好的主意。那将是什么解决方案?

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

4 个答案:

答案 0 :(得分:3)

有两个主要的性能惩罚:

  1. 执行require本身所需的时间。在Ruby 1.9.1和Ruby 1.9.2中,执行所有require所花费的时间比线性可伸缩性更糟糕 - 如果你将require的数量增加一倍,它会花费你两倍多的时间很久 - 我认为这花了你四倍的时间。
  2. 执行require d文件中的代码所需的时间。如果您有类似以下的代码,那么执行代码将花费非常少的时间。
  3. 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提示如何解决这个问题。

相关问题