Ruby ЕСЛИ нет ARGV - программирование
Подтвердить что ты не робот

Ruby ЕСЛИ нет ARGV

Это мой код:

if ARGV[0] == false
    puts "Usage: ./script.rb argument"
    exit
end
print "Yey we got an argument: " ARGV[0]

Но я просто не могу проверить код, если ARGV [0] указан или нет, как мне это сделать?

4b9b3361

Ответ 1

Проверьте, если он empty? (или проверьте его длину):

if ARGV.empty?
  puts ...
  exit
end

Рассмотрим использование любого из парсеров аргументов командной строки Ruby, например OptionParser.

Ответ 2

Самый простой способ обработать позиционные аргументы (кроме использования драгоценного камня для этого) - это shift их по одному за раз:

arg1 = ARGV.shift
arg2 = ARGV.shift

Отсутствующий аргумент будет равен нулю. Позвольте использовать это, чтобы дать arg2 значение по умолчанию:

arg1 = ARGV.shift
arg2 = ARGV.shift || 'default value goes here'

Проверка требуемого аргумента тривиальна:

raise "missing argument" unless arg1

Также легко увидеть, было ли задано слишком много аргументов:

raise "too many arguments" unless ARGV.empty?

Ответ 3

Я понимаю, что хорошее решение уже дано, но никто не упоминал о реальной причине, почему ваш пример не работал.

Проблема с вашим примером кода заключается в том, что если аргументов нет, ARGV[0] вернет nil, а nil == false будет false. nil является "ложным", но не равным false. Что вы могли бы сделать:

unless ARGV[0]
  puts "Usage: ..."
  exit 1
end

Что бы сработало, потому что это утверждение теперь зависит от фальсификации, а не от равенства с фактическим false.

Но не используйте этот код, это намного яснее, если вы укажете свое фактическое намерение, которое вы хотите знать, если есть какие-либо аргументы (вместо того, является ли первый аргумент ложным). Поэтому используйте предложенный код:

if ARGV.empty?
  puts "Usage..."
  exit 1
end

Ответ 4

Вы можете проверить длину ARGV. Если он имеет нулевые элементы, то ARGV[0] не задано.

Ответ 5

Чтобы проверить, задан ли ARGV [0] (или больше аргументов):

puts 'Usage: ...' if ARGV.length == 0

Вы также можете использовать ARGV.пути? (Ответ @DaveNewton)

Ответ 6

Вот что я делаю:

a = 'defaultvalue' if (a = ARGV.shift).nil?

Кто-то предложил это:

a = ARGV.shift || 'defaultvalue'

Это неверно, поскольку любое ложное значение приведет к назначению defaultvalue, например:

args=[false]; a=args.shift||true; # a has final value true when it should be false