Как я могу правильно исправить этот вывод файла ruby? - PullRequest
0 голосов
/ 11 января 2019

Используя этот формат кода:

class Country
  CODE_TO_NAME = {
    :us => 'United States',
    :mx => 'Mexico',
    :fr => 'France',
    :gr => 'Germany'
  }

  def self.name(code)
    # Write some code here
  end
end

puts Country.name(ARGV.shift)

Я хочу, чтобы мой код запускался с таким выводом:

$ ruby country_name.rb
Code not specified
$ ruby country_name.rb ca
Not match
$ ruby country_name.rb us
United States
$ ruby country_name.rb mx
Mexico

Как мне поступить об этом?

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Другая опция, проверка кода перед вызовом метода:

class Country
  # no changes here

  def self.name(code)
    return "Not found" unless CODE_TO_NAME.has_key? code
    CODE_TO_NAME[code]
  end
end

code = ARGV[0]
abort("Code not specified") unless code
puts Country.name(code.to_sym)
0 голосов
/ 11 января 2019

Итак, нам нужно заботиться о трех случаях:

  1. пользователь не вводит код
  2. пользователь вводит код, которого нет в базе данных
  3. пользователь вводит код, который находится в базе данных

В первом случае ARGV.first будет nil. Мы можем добавить nil ключ к CODE_TO_NAME с соответствующим сообщением.

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

В третьем случае код, который мы получаем из командной строки, будет String, а не Symbol, поэтому, если мы изменим ключи в CODE_TO_NAME на String s, мы можем индексировать в CODE_TO_NAME напрямую, без каких-либо преобразований.

#!/usr/bin/env ruby

class Country
  CODE_TO_NAME = Hash.new('Not match').merge({
    'us' => 'United States',
    'mx' => 'Mexico',
    'fr' => 'France',
    'gr' => 'Germany', # BTW, the ISO-3166-1 alpha-2 code for Germany is 'de'
    nil  => 'Code not specified'
  }).freeze

  def self.name(code)
    CODE_TO_NAME[code]
  end
end

puts Country.name(ARGV.shift)
0 голосов
/ 11 января 2019

Во-первых, назовите путь вашего кода как country_name.rb. Затем определите Country.name как:

def self.name(code)
  case
  when code.nil? then "Code not specified"
  when name = CODE_TO_NAME[code.to_sym] then name
  else "Not match"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...