2016-04-08 3 views
1

Я пытался выяснить, как сделать флаги с помощью ARGV (я знаю о optparser, я не хочу, чтобы использовать его)Изготовление флагов и работает DEFUALT когда никто не дал ARGV

Что я хотел бы чтобы сделать, это флаг, чтобы загрузить файл, и флаг, чтобы показать помощь, если ни один флаг не дано, я хочу, чтобы запустить программу, как она стоит ..

Пример say_hi.rb:

def usage 
    $stderr.puts("Usage: #{File.basename}: [-f|u] <file/path/>") 
    exit 
end 

$file = nil 
$help = usage 

loop { case ARGV[0] 
     when '-f' then ARGV.shift; $file = ARGV.shift 
     when '-h' then ARGV.shift; $help = ARGV.shift 
     else 
      #No flag given, run program with "John" as the method argument 

end } 

def say_hi(name) 
    puts "Hi #{name}! How are you?!" 
end 

say_hi("John") 

Токовый выход:

C:\Users\Jason\MyScripts>ruby say_hi.rb 
Usage: say_hi.rb: [-f|u] <file/path/> 

C:\Users\Jason\MyScripts>ruby say_hi.rb -f john.txt 
Usage: say_hi.rb: [-f|u] <file/path/> 

C:\Users\Jason\MyScripts>ruby sayhi.rb -h 
Usage: say_hi.rb: [-f|u] <file/path/> 

john.txt:

John 

Ожидаемый результат:

#running without flag => 
ruby say_hi.rb 
#<= Hi John! How are you?! 

#running with -h flag(help) => 
ruby say_hi -h 
#<= Usage: say_hi: [-f|u] <file/path/> 

#running with the -f flag(file) => 
ruby say_hi -f temp/name_file.txt 
#<= Hi John! How are you?! 

Как я могу выполнить это делать?

+0

Что такое 'say_hi.rb'? – sawa

+0

@sawa Извините за путаницу, отредактировал вопрос, чтобы быть более конкретным. – JasonBorne

+0

ваш код выглядит так, как будто это сработает. какая у вас проблема? Кстати, если вы запустите 'FOO = BAR irb', то в irb вы можете получить доступ к ENV [" FOO "] # =>" BAR "'. Если вам нужно выйти из программы раньше, просто используйте 'exit'. –

ответ

1

Файл выходит из-за этого: $help = usage. Метод usage имеет команду exit, которая заставляет скрипт выводить текст использования и затем выходить.

Как только вы пройдете мимо этого, loop { ... } вызовет запуск программы навсегда, поскольку это бесконечный цикл.

То, что я думаю, что вы хотите что-то вдоль линий этого:

def usage 
    $stderr.puts("Usage: #{File.basename(__FILE__)}: [-f|u] <file/path/>") 
end 

def say_hi(name) 
    puts "Hi #{name}! How are you?!" 
end 

args = ARGV.dup 
arg = args.shift # get the flag 

case arg 
when '-f' 
    file = args.shift 
    puts "doing something with #{file}" 
when '-h' 
    usage 
else 
    say_hi("John") 
end 

Но если вы ждете, чтобы пользователь имел возможность анализировать в нескольких аргументах и ​​флагов, а что нет, то вы можете использовать a while для анализа аргументов:

args = ARGV.dup 
names = [] 

# parse all of the args 
while (flag = args.shift) 
    case flag 
    when '-f' 
    file = args.shift 
    when '-h' 
    # this will cause the program to exit if the help flag is found 
    usage 
    exit 
    else 
    # this isn't a flag, lets add it to the list of things to say hi to 
    names << flag 
    end 
end 

if names.empty? 
    say_hi("John") 
else 
    names.each {|name| say_hi(name) } 
end 
+0

Это красиво, большое вам спасибо! – JasonBorne

+0

Рад, что я мог бы помочь :) – br3nt

+0

Как я могу вызвать файл для вывода имени внутри него? Могу ли я сделать это с помощью 'IO.readlines (" # {args} ")'? – JasonBorne

Смежные вопросы