我有一個紅寶石腳本,有一個散列。如何從命令行傳遞散列?
例子:
animal_sound = { 'dog' => 'bark', 'cat' => 'meow' }
我要添加 '蛇'=> '嘶嘶'
例子:
myscript.rb --addsound "'snake' => 'hiss'"
然後在我的劇本已經是將其添加到animal_sound。
例子:
animal_sound.merge! 'snake' => 'hiss'
=> {"dog"=>"bark", "cat"=>"meow", "snake"=>"hiss"}
有沒有辦法做到這一點?
這裏是整個腳本:
#!/usr/bin/env ruby
require 'rubygems'
require 'micro-optparse'
options = Parser.new do |p|
p.option :addsound, "add sound"
end.process!
animal_sound = { 'dog' => 'bark', 'cat' => 'meow' }
if options[:add_sound]
newsound = options[:add_sound]
animal_sound.merge! newsound
end
puts animal_sound
當我運行我的腳本,我得到:
$ bin/myscript.rb --addsound "'snake' => 'hiss'"
bin/myscript.rb:14:in `merge!': can't convert true into Hash (TypeError)
from bin/myscript.rb:14:in `<main>'
解決: 使用PSkocik的解決方案,我拿到劇本的使用工作animal, sound = options[:addsound].split(' => '); animal_sound[animal] = sound
我還使用Simone Carletti的想法來簡化CLI命令。僅供參考,如果我想通過哈希格式,如myscript.rb --addsound "'snake' => 'hiss'"
也可以。當然,拆分必須改回split(' => ')
。我喜歡使用:
的更簡單的CLI。
例子:
myscript.rb --addsound snake:hiss
終極密碼:
#!/usr/bin/env ruby
require 'rubygems'
require 'micro-optparse'
options = Parser.new do |p|
p.option :addsound, "add sound", default: ""
end.process!
animal_sound = { 'dog' => 'bark', 'cat' => 'meow' }
if options[:addsound]
animal, sound = options[:addsound].split(':')
animal_sound[animal] = sound
end
puts animal_sound
命令行:
$ bin/myscript.rb --addsound snake:hiss
{"dog"=>"bark", "cat"=>"meow", "snake"=>"hiss"}
我無法讓自己的合併工作。 每篇文章都很有幫助。謝謝。
傳遞很長的命令行參數通常是一個糟糕的計劃。爲什麼不像許多其他實用程序那樣有指定文件的參數,或者從STDIN讀取? YAML和JSON都非常易於讀寫,即使是手工編寫,也可以非常乾淨地映射到本地Ruby結構。使用'YAML.load'或'JSON.load'來導入它們。 – tadman