Как превратить символ с подчеркиванием (например, The_Dark_Knight), когда символ является ключом в ha sh, в строку с пробелами между словами? - PullRequest
0 голосов
/ 04 мая 2020

Я новичок в кодировании и занимаюсь этим только около 12 дней, так что простите меня. Сначала я решил выучить Ruby, так как освоить его не особенно сложно. Я делаю небольшую программу, которая отслеживает и хранит информацию от пользователей. В этом конкретном разделе кода я хочу отследить и сохранить то, как пользователь оценил конкретный mov ie. Я поиграл с несколькими функциями, такими как добавление, отображение, удаление и обновление фильмов (эти четыре элемента являются «когда» как часть оператора case). Я наткнулся на контрольно-пропускной пункт на показной части.

Ха sh, вопрос, который я использовал для проверки программы (Отказ от ответственности: оценки mov ie не предназначены для оскорбления):

movies = {
  The_Dark_Knight: 10,
  Justice_League: 1,
  Wolverine_Origins: 7,
  Wonder_Woman: 6,
  Man_of_Steel: 8 
}

и Я хочу, чтобы Ruby отображал заголовки фильмов в га sh (после их итерации) вместе с рейтингами как таковые:


=begin 
The Dark Knight: 10
Justice League: 1
Wolverine Origins: 7 
Wonder Woman: 6
Man of Steel: 8 
=end 

Это часть отображения оператора case. «Когда» пользователь выбирает дисплей, он должен показывать им названия mov ie вместе с рейтингом, как показано выше.

when "display"

movies.each {|title, rating|

title_as_string = title.to_s.split('_').map(&:capitalize).join(' ')

puts "#{title_as_string}: #{rating}"
} 

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

... Вопрос: есть ли более лаконичный или лучший способ сделать это? Если да, то как?

Ответы будут очень благодарны.

1 Ответ

1 голос
/ 04 мая 2020

Есть много способов сделать то же самое.

  1. Вы можете использовать String#gsub - это означает «глобальное замещение», которое является именно тем, что вы хотите сделать - замените _ пробелом:

      title_as_string = title.to_s.gsub("_", " ")
    

    Вы также можете использовать String#tr - метод не делает то же самое, но в этом случае вы может заменить gsub на tr, и это будет иметь тот же результат

  2. Использовать строки в качестве ключей. Это не так просто записать, потому что вам нужно использовать синтаксис hashrocket (=>), но устраняет необходимость замены:

      movies = {
        "The Dark Knight" => 10,
        "Justice League" => 1,
        # etc
      }
    
  3. Вставьте пробелы в символы - этот подход используется не так часто, но он полностью допустим: синтаксис:

      movies = {
        "The Dark Knight": 10,
        "Justice League": 1,
        # etc
      }
    

    Единственное Единственное различие между этим и строковыми ключами в том, что я заменил хеш-ракету => на двоеточие :. Вам все еще нужно позвонить .to_s в этом случае, но не нужно делать замену. Как отметили инженеры в комментарии, есть и другие отличия ... вероятно, я бы не советовал этот подход, потому что он не очень распространен

  4. Использовать объект данных " шаблон. Это немного более многословно, но и более явно:

      movies = {
        The_Dark_Knight: {
          name: "The Dark Knight",
          rating: 10
        },
        Justice_League: {
          name: "Justice League",
          rating: 1
        }
      }
    
      movies.each {|key, data|
        title_as_string = data[:name]
        rating = data[:rating]
        # etc
      }
    

    Это может показаться избыточным, но на самом деле это более гибко - что делать, если вы сохранили эти фильмы в базе данных и хотели использовать идентификатор в качестве ключ для га sh вместо? Таким образом, вы можете быстро просматривать записи по их ID.

Еще одна вещь, вы должны использовать do ... end для своих многострочных блоков. Используйте только скобки для блоков oneliner.

...