В чем смысл ARGV в Ruby?

В чем смысл ARGV в Ruby?

first, second, third = ARGV 
puts "The script is called: #{$0}"
puts "Your first variable is: #{first}"
puts "Your second variable is: #{second}"
puts "Your third variable is: #{third}"

Какой смысл в этом, когда для запуска файла мне нужно сделать:

ruby ex1.rb

и чтобы ввести первую, вторую и третью переменные, мне нужно ввести

ruby ex1.rb blah blah blah

Какую пользу это приносит человеку, управляющему программой? Они все равно не могут этого сделать, так как я предполагаю, что это исполняемый файл:

user = ARGV.first
prompt = '> '

puts "Hi #{user}, I'm the #{$0} script."
puts "I'd like to ask you a few questions."
puts "Do you like me #{user}?"
print prompt
likes = STDIN.gets.chomp()

puts "Where do you live #{user}?"
print prompt
lives = STDIN.gets.chomp()

puts "What kind of computer do you have?"
print prompt
computer = STDIN.gets.chomp()

puts <<MESSAGE
Alright, so you said #{likes} about liking me.
You live in #{lives}.  Not sure where that is.
And you have a #{computer} computer.  Nice.
MESSAGE

Может кто-нибудь объяснить мне это?


person Jason    schedule 11.11.2012    source источник
comment
Они все равно не могут этого сделать, так как я предполагаю, что это исполняемый файл, демонстрирующий недостаток мышления. Какая разница, если это исполняемый файл? Это просто бит, который устанавливается в ОС и не влияет на то, может ли скрипт принимать параметры. Возможно, вы имели в виду, что сценарий будет запускаться и использоваться с графическим интерфейсом, но даже в этом случае сценарий может получать параметры как часть процесса запуска... что заставляет меня думать, что весь этот вопрос ошибочен.   -  person the Tin Man    schedule 11.09.2013
comment
В приведенном примере все входные данные собираются во время выполнения в ответ на ввод пользователя. ARGV должен собрать эти данные в начале прогона без участия пользователя.   -  person JDS    schedule 03.10.2013
comment
Рассмотрим случай, когда каждый фрагмент вашего кода выше довольно дорог и занимает, например. 10 секунд на бег. Вы бы предпочли печатать, ждать 10 секунд, печатать, ждать 10 секунд и т. д. -или печатать, а затем ждать 30 секунд? Есть один пример того, почему полезно предоставлять аргументы при первоначальном выполнении, а не по мере необходимости.   -  person Adam Marshall    schedule 16.03.2014
comment
Также можно запускать ruby-скрипты (и многое другое), используя строку shebang, например #!/usr/bin/env ruby, в верхней части вашего файла ex1.rb. Если вы chmod a+x ex1.rb, вы можете запустить его без префикса ruby : ./ex1.rb. И на самом деле расширение .rb даже не нужно, что означает, что вы, возможно, уже использовали ruby-скрипты, которые принимают аргументы командной строки, даже не осознавая этого.   -  person beporter    schedule 11.06.2020


Ответы (5)


Какой смысл в ARGV в Ruby?

ARGV "содержит аргументы, переданные вашему сценарию. , по одному на элемент."

Какой в ​​этом смысл, когда для запуска файла нужно сделать: ruby ex1.rb а чтобы вставить первую, вторую и третью переменные нужно ввести ruby ex1.rb blah blah blah.

Это точная точка, чтобы иметь возможность указывать аргументы при запуске файла, например:

ruby ex1.rb -a -b 3

Какую пользу это приносит человеку, управляющему программой?

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

Они все равно не могут этого сделать, так как я предполагаю, что это исполняемый файл.

Да, они могут. Вы только что привели пример того, как именно пользователь будет запускать вашу программу таким образом. Является ли он исполняемым или нет, ничего не меняет.

person Andrew Marshall    schedule 11.11.2012
comment
Я работал над той же проблемой, и сначала у меня была некоторая путаница, но потом я смог ее решить. Ваш ответ ARGV здесь помог подтвердить мое понимание. Мой единственный вопрос: что такое .first в user = ARGV.first? - person Padawan; 15.06.2015
comment
@Padawan ARGV представляет собой массив всех аргументов (как указано в связанных документах в моем ответе), поэтому ARGV.first получает первый. Здесь используется обычный старый Array#first. - person Andrew Marshall; 15.06.2015

ARGV имеет давнюю традицию и происходит из мира UNIX/POSIX, где большинство программ на C должны содержать следующее:

int main(int argc, char **argv)
{
   return(0);
}

Здесь argc представляет количество переданных аргументов, а argv — это низкоуровневый указатель на первый из возможных строковых указателей. Имя argv закрепилось в различных формах.

Аргументы командной строки очень популярны среди разработчиков, хотя обычно они используются не совсем так, как вы думаете. С безымянными аргументами гораздо сложнее иметь дело. Вот почему существуют такие вещи, как optparse, чтобы помочь справиться с ними.

Вот пример из документации OptionParser:

require 'optparse'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
    options[:verbose] = v
  end
end.parse!

p options
p ARGV

Это позволяет вам определять гораздо более полезные аргументы командной строки, а затем использовать их. В вашем примере я ожидаю, что это будет работать так:

test_script --live "New York" --computer "Lenovo" --like

Это делает совершенно очевидным, что такое аргументы, потому что они названы.

person tadman    schedule 11.11.2012
comment
всегда полезно знать историю, очень приятно связывать ее с вероятным происхождением самого имени переменной - person Justin Ohms; 20.07.2016

Рассмотрим некоторые утилиты командной строки Ruby, такие как rails, rake, gem или bundle. Хотя ни одно из них не является приложением для конечного пользователя (например, веб-приложения или приложения с графическим интерфейсом), они по-прежнему являются программами, написанными на Ruby, с которыми взаимодействуют пользователи. Все они принимают аргументы:

$ rails new my_app
$ rake tests
$ gem install rails --no-rdoc --no-ri
$ bundle update

Можно использовать ARGV для реализации таких программ командной строки, которые принимают аргументы. Хотя мы часто будем использовать стандартную библиотеку OptionParser или какой-либо другой инструмент для этой цели ARGV является низкоуровневой коллекцией, на основе которой создаются эти инструменты.

Так что, если вы когда-либо запускали gem, rails, rake или bundle, или любой инструмент разработчика командной строки, написанный на Ruby, вы получите пользу от ARGV!

person Gregory Brown    schedule 11.11.2012

Смысл ARGV в том, что он позволяет запускать скрипты без участия человека, а также допускает случай, когда ввод может меняться от одной итерации к другой.

Например, вы можете запустить три разных сценария, чтобы получить три значения. Затем эти значения могут быть переданы в этот сценарий, и ARGV можно использовать для получения значений этих параметров.

person Gary    schedule 12.02.2014

Раньше я запускал скрипт, который запрашивал у меня адрес электронной почты и пароль. Он использовался для входа в один из сотен аккаунтов. Как и большинство сценариев Ruby, я запускал его из командной строки. Это должно было выглядеть как «исполняемый файл», особенно со значком, по которому вы щелкаете.

Я запускал программу, и она запрашивала у меня адрес электронной почты и пароль, а затем входил в систему с помощью Watir.

puts "Email of Account"
account_email = gets.chomp

puts "Enter Password"
password = gets.chomp

# code that logs me in

Однако я обнаружил, что получение этих значений через ARGV было намного быстрее для моих целей.

account_email, password = ARGV
# code that logs me in

Тогда я мог бы просто напечатать

$ ruby my_script.rb [email protected] mypassword

и нажмите Enter. Также я мог просто нажать стрелку вверх в консоли, чтобы запускать его снова и снова, или последние версии с разными именами и паролями, чтобы быстро протестировать мой скрипт.

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

ruby my_script.rb [email protected] mypassword
ruby my_script.rb [email protected] otherpassword

Наконец, иногда мне приходилось задавать десятки параметров при каждом запуске скрипта, а затем запускать этот скрипт много раз. Таким образом, я также мог легко вставить десятки переменных в скрипт из командной строки.

ruby my_script.rb option1 option2 option3 option4

Я новичок в использовании ARGV и надеюсь научиться лучше его использовать, но это одна из функций, которую я нашел очень полезной.

person John Escobedo    schedule 18.11.2014