Почему самый верхний, если условия игнорируются? - PullRequest
0 голосов
/ 14 марта 2019

Я признаю, что я все еще новичок в 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

Спасибо Максу и всем за то, что показали мне мою ошибку.Забыли вернуть выбранный внизу функции.

1 Ответ

2 голосов
/ 14 марта 2019

Нет явного возврата в selected_servers, поэтому он возвращает значение последнего выражения, которое он выполняет, что обычно является ошибкой unless. Ошибка, если / если не возвращает nil.

...