0

我有一个相当简单的脚本,我需要能够接收从命令行或文件传入的数据,然后取决于第一个命令(如果数据来自命令行,则为 ARGV[0])在我的脚本中实例化唯一类的新实例或更改该类的现有实例的属性,然后输出我完成对输入数据的迭代后发生的情况的摘要。

我想我知道当它是一个文件时我在做什么,但是当数据通过命令行传递时我有点坚持如何做到这一点。

我知道只有一个数据我会做:

ruby filename.rb command1 command2 command3

在我的脚本中,我会有类似的东西

instance = ClassName.new(ARGV[0], ARGV[1], ARGV[2])

..但是在这种情况下,我希望能够对这三个命令中的几组执行此操作。所以像:

ruby filename.rb command1 command2 command3
ruby filename.rb anothercommand1 anothercommand2 anothercommand3

..并重复直到所有数据都在,然后调用summary方法。任何有关如何实现这一点的建议将不胜感激!

4

1 回答 1

0

如果我正确理解您想要做什么:

ARGV.each_slice(3) { |a1, a2, a3|
  # NB: a2 and/or a3 may be nil here if ARGV.size % 3 ≠ 0
  puts "#{a1}×#{a2}×#{a3}"
}
puts "Init NOW"

产量:

~ ruby a.rb arg1 arg2 arg3 arg4 arg5 arg6 arg7
# arg1×arg2×arg3
# arg4×arg5×arg6
# arg7××
# Init NOW

UPD 澄清任务后:

class Operator
  attr_accessor :a1, :a2, :a3, :a4 
  def initialize attrs
    @a1, @a2, @a3, @a4 = attrs
  end 
  def begin
    puts "[BEGIN] ⇒ 1: #{@a1}, 2: #{@a2}, 3: #{@a3}"
  end 
  def add 
    puts "[ADD]   ⇒ 1: #{@a1}, 2: #{@a2}, 3: #{@a3}, 4: #{@a4}"
  end 
  def subtract
    puts "[SUBTR] ⇒ 1: #{@a1}, 2: #{@a2}, 3: #{@a3}, 4: #{@a4}"
  end 
end

meth, *args = ARGV

Operator.new(args).send (meth.to_sym)

这使:

~ ruby a.rb add arg1 arg2 arg3 arg4
# [ADD]   ⇒ 1: arg1, 2: arg2, 3: arg3, 4: arg4
~ ruby a.rb begin arg1 arg2 arg3
# [BEGIN] ⇒ 1: arg1, 2: arg2, 3: arg3
于 2013-03-01T16:55:38.510 回答