2016-05-18 3 views
0

У меня есть простой код для класса. Это:Почему мой .rb-скрипт не помещается в bash?

def greeting 
greeting = ARGV.shift 
    ARGV.each do |arg| 
    p "#{greeting}, #{arg}!" 
    end 
    end 

Мое желание состоит в том, чтобы просто вывести «Привет, Чарли!». и «Привет, Сэм!» основанный на именах, хранящихся в массиве. Однако, когда я пытаюсь запустить программу в рубине, похоже, что я использовал оператор return.

address_bloc :> ls 
address_bloc.rb greeting.rb  ruby 
argv_test.rb models   spec 

address_bloc :> greeting.rb Yo Tommy Bob Sally 
-bash: greeting.rb: command not found 

address_bloc :> ruby greeting.rb Yo Sam Sean Bill 

address_bloc :> ruby greeting.rb Yo Sam Sean Bill 
+0

Похоже, вы определили функцию 'приветствие()', но никогда не называли. Добавьте 'greeting()' в конец скрипта, и вы должны получить выход. –

+0

Работает! Спасибо, Майкл! – Sean

+1

Чтобы запустить скрипт Ruby из вашей оболочки, вам необходимо: 1) вставить строку '#!/Usr/bin/env ruby' в первую строку, 2) изменить разрешение файла для включения исполняемого файла (' chmod + x greeting.rb')) и 3) включить каталог при запуске ('./greeting.rb'). –

ответ

4

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

greeting = ARGV.shift 
ARGV.each do |arg| 
    puts "#{greeting}, #{arg}!" 
end 

Если вы хотите продолжить с определением Общерелятивистского функция цели для приветствия список имен, вы также можете сделать это, позвонив greeting и передавая ему содержимое ARGV, как в следующем примере:

def greeting(args) 
    greeting = args.shift 
    args.each do |arg| 
    puts "#{greeting}, #{arg}!" 
    end 
end 
greeting ARGV 

Но в целом, это лучше, если функция его аргументы являются более значимыми, поэтому рассмотреть возможность сделать что-то вроде этого:

def greet_list(greeting, name_list) 
    name_list.each do |arg| 
    puts "#{greeting}, #{arg}!" 
    end 
end 
greet_list ARGV.shift, ARGV 
+0

только для уточнения. те, которые следуют за заявлением о вызове в конце «ARGV.shift» и «ARGV», работают как фильтры для аргументов, входящих в этот метод? Спасибо! – Sean

+0

@Sean Что-то в этом роде. В основном он устанавливает «приветствие» в методе значение «ARGV.shift» (первый аргумент скрипту). Затем он устанавливает 'name_list' все остальные значения' ARGV'. Таким образом, внутри функции greet_list вам не нужно включать эту дополнительную строку 'greeting = ARGV.shift'; он уже позаботился о вас. – user108471

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