在Ruby中执行多个需求的最佳方法是什么?

时间:2011-02-05 02:27:31

标签: ruby rubygems

我不确定我是否已经看过这个问题,但我想知道在ruby脚本中执行多个需求的最佳方法是什么。我已经提出了几个基本的例子,我将在下面概述,但我不确定是否有最好的做法 - 我的搜索结果没有回来。

0)一堆包括&例外(我将退出救援)

require 'rubygems'
require 'builder'

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)??

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

5 个答案:

答案 0 :(得分:17)

简单的方式是最好的方式。

你可以做到这一点,但是为了聪明而交易清晰 - 这是一个糟糕的讨价还价:

[
  'rubygems',
  'rack',
  'rails'
].each(&method(:require))

使用花哨的错误消息跳过“救援”。当require需要抛出堆栈跟踪时,每个人都知道它意味着什么。

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

答案 1 :(得分:11)

我见过的所有ruby脚本都只列出了一行,就像你第一次一样。

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

答案 2 :(得分:5)

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

在第二部分,它需要有人解码你正在做的事情。

迫使所有人解码你正在做的事情似乎有点异想天开,所以你可以保存几行键入(只有当你在一个源文件中使用了大量的库时才会这样做代码气味本身)。请记住,代码读取的次数是写入的一个数量级的三倍或三倍。如果它是易于书写或易于阅读之间的选择,阅读应该胜出。

答案 3 :(得分:0)

%w(rubygems rack rails).each { |gem| require gem }

或者,具有可重复使用的功能:

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

流行的Ruby风格(尤其是单行功能)都没有,但Ruby包含TIMTOWTDI,所以如果它们适合你,请使用它们。

答案 4 :(得分:0)

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

def require_all(*gems)
   g = *gems
   g.each {|gem| require gem }
end

或者将此单行代码添加到代码的开头:

def require_all(*gems); g = *gems; g.each { |gem| require gem }; end

您可以将多个宝石传递给require_all;例如

require_all 'rack', 'bundler', 'rails'

以此类推。 从以上答案中得到了这个主意!