Вопрос по ruby, stdin, argv – Какой смысл ARGV в Ruby?

0

Какие'смысл 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 
Рассмотрим случай, когда каждыйкусок» вашего кода выше довольно дорого, и занимает, например, 10 секунд, чтобы бежать. Вы бы предпочли набрать, подождать 10 с, набрать, подождать 10 с и т. Д ... или набрать, а затем подождать 30 секунд? Там'один пример того, почему этоПолезно предоставлять аргументы при первоначальном выполнении, а не как и когда они необходимы. Adam Marshall
В данном примере все входные данные собираются во время выполнения в ответ на пользовательский ввод. ARGV должен собирать эти данные в начале цикла, без участия пользователя. JDS
Они могут'не делай этого, так как ябуду предполагать, что это исполняемый файл показывает изъян в мышлении. Какая разница, если что-тоисполняемый файл? Тот'Это всего лишь немногоустановлен в ОС и неНе влияет на то, может ли скрипт принимать параметры. Возможно, вы имели в виду, что скрипт будет запущен и использован с графическим интерфейсом, но даже тогда онВозможно, что скрипт получит параметры в процессе запуска ... что заставляет меня думать, что весь этот вопрос ошибочен. the Tin Man

Ваш Ответ

5   ответов
5

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

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

83

Какие'сутьARGV в рубине?

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

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

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

ruby ex1.rb -a -b 3

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

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

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

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

@PadawanARGV это массив всех аргументов (как указано в связанных документах в моем ответе), поэтомуARGV.first получает первый. Просто обычный старыйArray#first используется здесь. Andrew Marshall
Я работал над той же проблемой, и сначала у меня была некоторая путаница, но потом я смог ее решить. Ваш ответ ARGV здесь помог подтвердить мое понимание. Мой единственный вопрос, что такое ".первый" в user = "ARGV.first "? Padawan
Ну, это ответило на твой вопрос? Дон»забытьupvote / принять ответы на ваши вопросы :) Andrew Marshall
13

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

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

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

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

3

Раньше я запускал скрипт, который спрашивал у меня адрес электронной почты и пароль. Он был использован для входа в один из 100 'с аккаунтов. Как и большинство сценариев 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

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

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

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

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

ruby my_script.rb option1 option2 option3 option4

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

23

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

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

всегда полезно знать историю очень приятно связывать ее с вероятным происхождением самого имени переменной Justin Ohms

Похожие вопросы