什么';在Ruby中实现多重需求的最佳方法是什么?

什么';在Ruby中实现多重需求的最佳方法是什么?,ruby,rubygems,Ruby,Rubygems,我不确定我是否见过这个问题,但我想知道在ruby脚本中实现多个需求的最佳方法是什么。我已经提出了几个基本的例子,我将在下面概述,但我不确定是否有一个最好的实践来解决这个问题——我的搜索结果没有任何结果 0)一堆包含和例外(我将不考虑救援) 1) 字符串数组 torequire = ['rubygems', 'builder'] begin torequire.each do |req| require req rescue LoadError => e # Not sure

我不确定我是否见过这个问题,但我想知道在ruby脚本中实现多个需求的最佳方法是什么。我已经提出了几个基本的例子,我将在下面概述,但我不确定是否有一个最好的实践来解决这个问题——我的搜索结果没有任何结果

0)一堆包含和例外(我将不考虑救援)

1) 字符串数组

torequire = ['rubygems', 'builder']
begin
  torequire.each do |req|
    require req
rescue LoadError => e
  # Not sure if this is great either
  puts "Missing required gem: " + e.message.split[-1]
  exit
end
2) ?


从字符串数组中加载它们是否会产生很大的问题?您可以类似地指定版本要求或位置,我只是想知道这样做是否有问题。

我看到的所有ruby脚本都只列出了一行所需的代码,就像第一行一样

require 'rubygems'
require 'rack'
require 'rails'

在第一个例子中,很清楚你在做什么

在第二种情况下,它需要有人解码你在做什么


强迫每个人都对你正在做的事情进行解码,这样你就可以节省几行键入的时间,这似乎有点异想天开(只有当你在一个源文件中使用了大量的库,而这个源文件本身就有点代码味道的时候)。请记住,代码的读取频率是其写入频率的一个数量级或三倍。如果是在简单的写作还是简单的阅读之间选择,那么阅读应该获胜。

简单的方式是最好的方式

你可以这样做,但它以清晰换聪明——一个糟糕的交易:

[
  'rubygems',
  'rack',
  'rails'
].each(&method(:require))
跳过带有奇特错误消息的“rescue”。每个人都知道当require抛出堆栈跟踪时意味着什么

如果您想让使用您的程序的人更容易安装所需的gems,请查看

或者,使用可重用功能:

def require_all(gems) ; gems.each { |gem| require gem } ; end
...
require_all %w(rubygems rack rails)

这两种风格都不是流行的Ruby风格(尤其是一个单行函数),但是Ruby支持,因此如果它们适合您,请使用它们。

这不是最好的,但如果您这样做:

def require_all(*gems)
g=*宝石
g、 每个{宝石{需要宝石}
结束
或者,将这一行添加到代码的开头:

def require_all(*gems);g=*宝石;g、 每个{gem}需要gem};结束
您可以将多个gem传递给
require_all
;e、 g

要求所有“机架”、“捆绑机”、“导轨”
等等。
从上面的答案中得到了这个想法

你不会说为什么仅仅做“require'xxx'”看起来是错误的。你会有条件地要求模块吗?由于相互依赖而产生的负载集?平台差异?此外,您的“rescue”块主要用于允许脚本尝试运行,即使所有需求都不存在;这绝不是一个好主意。对不起,我遗漏了停止脚本的“退出”行,我将在中编辑它。如果没有问题(代码分析工具、官方代码风格指南等),当我在一个脚本中有很多宝石时,我似乎可以保存一些行。+1“以清晰换聪明——糟糕的交易”,或者,正如他们在Spinal选项卡中所说,“聪明和愚蠢之间有一条细线。”哇。虽然我永远不会把这件事强加给别人,但这真的很聪明!对于任何想要细分的人(如果我错了,请纠正我),
method
返回一个
method
对象,并且符号调用
到它上面的_proc
,每个
都将其用作其块。方法签名用作块参数,将调用方转换为被调用方。也就是说,虽然
['rubygems'].each(&:require)
将调用
'rubygems.require()
['rubygems'].each(&方法(:require))
将调用
['rubygems'].each do | dependency |/*require的实现*/end
。超级整洁。谢谢这也是我的建议。它简单、简洁,而且不太难看。使用rubygems和bundler管理gems,而不是尝试推出自己的解决方案。
%w(rubygems rack rails).each { |gem| require gem }
def require_all(gems) ; gems.each { |gem| require gem } ; end
...
require_all %w(rubygems rack rails)