Я признаю, что я все еще новичок в Ruby, поэтому я еще не знаком с гочами и все еще учусь.
Я много раз гуглял проблему, но не смогнайти точный ответ.Большинство результатов говорят о «вложенных» операторах if / else.Что не то, что я пытаюсь.Я нашел другой ответ от SO, в котором говорилось о сопоставлении массивов в зависимости от условий, но мне кажется, что это вернет меня к тем же проблемам, которые у меня уже есть.
Ссылка на статью о слиянии вложенных массивов, если кому-то интересно: Ruby: объединение вложенных массивов друг с другом в зависимости от условия
Мой вопрос:
При разработке простого сценария CLI на ruby с использованием optparse для управления выводом на основе условий.Я столкнулся с проблемой, когда не могу выполнить несколько последовательных операторов if и объединить / объединить несколько массивов в один для передачи другой функции.
По какой-то причине только последний if block это честьВсе, если блоки до последнего возвращают ноль .
Может кто-нибудь сказать мне, что я делаю не так, и предоставить мне соответствующую документацию по моей проблеме.Например, почему возникает такая проблема?
Хотелось бы получить рабочее решение для обучения, но справочный материал тоже подойдет, поскольку моя цель - извлечь уроки из этого вопроса.
Результаты моих тестов:
$ ruby servers.rb
#=> ["server1", "server2", "server3"]
$ ruby servers.rb -m
#=> nil
$ ruby servers.rb -h
#=> nil
$ ruby servers.rb -s server6
#=> ["server6"]
$ ruby servers.rb -m -h
#=> nil
Вот мой сценарий:
#!/usr/bin/env ruby
require 'optparse'
@servers = {
'primary' => %w[server1 server2 server3],
'inhouse' => %w[server4 server5],
'mlm' => %w[server6]
}
@options = {
inhouse: false,
server: [],
mlm: false
}
# Parse options passed to medusabackup.rb
optparse = OptionParser.new do |opts|
opts.on('-h', '--inhouse', 'Limit results to inhouse results') do
@options[:inhouse] = true
end
opts.on('-m', '--mlm', 'Include mlm results') do
@options[:mlm] = true
end
opts.on('-s', '--server=SERVER', 'Limit results to SERVER') do |f|
@options[:server] << f
end
opts.on_tail('--help', 'Display this screen') { puts opts, exit }
end
begin
optparse.parse!
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
puts $ERROR_INFO.to_s
puts optparse
exit
end
def selected_servers
# Setup Selected variable as an array
selected = []
# If @options[:server] array is not empty and @options[:server]
# add @options[:server] servers to [selected] array
if @options[:server].empty?
# If @options[:mlm] is true add @server['mlm'] servers to [selected] array
selected.concat @servers['mlm'] if @options[:mlm]
# If @options[:inhouse] is true add @server['inhouse'] servers to [selected] array
selected.concat @servers['inhouse'] if @options[:inhouse]
# If @options[:mlm], @options[:inhouse] is true add @server['mlm'] servers to [selected] array
selected.concat @servers['primary'] unless @options[:mlm] || @options[:inhouse]
else
selected.concat @options[:server]
end
end
puts selected_servers.inspect
Спасибо Максу и всем за то, что показали мне мою ошибку.Забыли вернуть выбранный внизу функции.