Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 没有必要要求(s)事项?_Ruby_Require - Fatal编程技术网

Ruby 没有必要要求(s)事项?

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] 更新

我希望能够有一个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]

更新 看起来在这两个.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]})