2013-03-01 51 views
0

我有一個相當直接的腳本,我需要能夠接收從命令行或文件傳入的數據,然後根據第一個命令(對於來自命令行的數據,ARGV [0])或者在我的腳本中實例化唯一類的新實例,或者更改該類的現有實例的屬性,然後輸出I完成對輸入數據的迭代。通過命令行傳遞多個數據分別使用ARGV進行評估

我想我知道我在做什麼,當它是一個文件,但我有點卡住如何做到這一點,當數據通過命令行傳遞。

我知道只有一個數據,我正做的事:

ruby filename.rb command1 command2 command3 

而且我的劇本里我有類似

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

..但在這種情況下,我希望能夠爲幾組這3個命令做到這一點。所以像這樣:

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

..並重復,直到所有的數據都在,然後調用匯總方法。任何關於如何實施這個建議將非常感謝!

回答

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 
+0

對不起,缺乏清晰度 - 這將適用於我措辭不佳的問題要求,但我實際上處理的情況下,我的第一個參數將是3-4(開始/添加/減去)不同的東西。如果我的第一個參數是開始的,那麼我會在該語句中有3個參數,但如果它是其他參數之一,我會在語句中有4個參數。所以我正在尋找一種基本上爲每個'行'數據分開ARGV的方法,或者其他一些等效的方法。希望這比我最初的帖子更清晰。 – user2057076 2013-03-01 17:45:49

+0

請參閱答案的更新。如果你需要對代碼進行一些評論,請不要猶豫。 – mudasobwa 2013-03-01 18:13:51

+0

完美,非常感謝! – user2057076 2013-03-01 18:28:40