Ruby 没有必要要求(s)事项?
我希望能够有一个ruby文件,可以Ruby 没有必要要求(s)事项?,ruby,require,Ruby,Require,我希望能够有一个ruby文件,可以要求所有公共依赖项,这样其他文件就可以在这个共享文件上有一个要求;我有foo.rb和bar.rb以及allrequires.rb。我想在foo.rb和bar.rb中都有一行require“allrequires.rb”,但是bar.rb并不需要所有requires 如果我在.rb文件中使用不需要该文件的require,这有关系吗?它可能会对性能产生影响吗 我目前使用的是ruby 1.8.7(2010-08-16补丁级别302)[i386-mingw32] 更新
要求
所有公共依赖项,这样其他文件就可以在这个共享文件上有一个要求
;我有foo.rb和bar.rb以及allrequires.rb。我想在foo.rb和bar.rb中都有一行require“allrequires.rb”
,但是bar.rb
并不需要所有requires
如果我在.rb文件中使用不需要该文件的require
,这有关系吗?它可能会对性能产生影响吗
我目前使用的是ruby 1.8.7(2010-08-16补丁级别302)[i386-mingw32]
更新
看起来在这两个.rb文件中“共享”或“使用所有要求”并不是最好的主意。解决这个问题的办法是什么
现在我可以考虑在某种情况下使用文件名。有两个主要的性能损失:
所需的时间要求本身。在Ruby 1.9.1和Ruby 1.9.2中,执行所有require
s所需的时间比线性可伸缩性差-如果将require
s的数量增加一倍,则所用的时间是原来的两倍多-我认为是原来的四倍
require
d文件中的代码所用的时间。如果您有如下代码,那么执行代码将花费大量时间是的,将会有一个StutualPuffic,你可以确定MutCH如何考虑它是否真的重要。 有了多个require,我像这样在代码中添加了hem,这样就不会占用太多屏幕空间
['green_shoes','Hpricot'].each(&method(:require))
你也可以做一个有条件的require,但是在你的代码中到处都是这样会很难看
begin
data = JSON.parse(text)
rescue
require 'json_pure'
data = JSON.parse(text)
end
简而言之,为每个rb提供自己的require的另一种条件require方法,下面的脚本在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__)}
我的最终解决方案是(万一有人觉得有用):
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的提示。第一句话是什么意思?你说的分享是什么意思?我不明白。为什么需要更长的时间?@Radek我已经改写了#2的第一句话-现在有意义吗?我没有那么深的ruby/编程知识,所以我无法理解为什么在一个(特定)文件中执行代码需要更长的时间。因为引擎必须搜索所有需要的正确代码?我更新了我的问题。。。你能为我的情况提出一个解决方案吗?@Radek一旦你完成了所有的要求,几乎总是没有缺点。我想我要找的是“有条件的要求”。你能给我解释一下if的语法吗
如果“require1.rb,script2.rb”[File.basename(\uuu File\uuuu)]
当然,“require1.rb,script2.rb”是您希望对其进行操作的脚本名字符串,[]在字符串检查括号内的字符串是否存在(简化的正则表达式)之后,这里是一个常量文件,我从中获取脚本名。因此,我检查字符串中是否存在scriptname。你可以使用一个数组和一个扫描或映射函数来做检查,结合我的另一个答案也是可能的。为什么文件名用逗号分隔?这是一个字符串还是两个字符串?一个字符串,逗号只是一个分隔符。我的答案是有一个带有数组的版本,它比stringapproach更清晰、更安全
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]})