Мои два фрагмента кода используют точную карту! функционируют, но действуют по-другому

Я работаю над базовым проектом вдохновителя со случайным выбором цветов, и пользователь должен его угадать.

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

module Shapes
  CIRCLE = "●"
  COLORS = {
    1 => :red,
    2 => :green,
    3 => :magenta,
    4 => :blue,
    5 => :cyan,
    6 => :yellow,
    8 => :white,
    9 => :black
}
end

Существует два кода, в которых один берет значения из случайной функции, а другой вводит пользователь. со вторым значения [nil,nil,nil,nil], что не имеет смысла. Помогите мне исправить проблемы с тем, что я делаю не так с картой! функция.

Код в моем main.rb

  def random_code
    arr = Array.new(4) {(rand(1..6).to_i)}
    puts arr
    arr.map! do |item|
      color = COLORS[item]
      CIRCLE.colorize(color)
    end
    puts arr
    return arr
  end
end

Мой другой код внутри другого модуля

      p_code.map! do |item|
        colors = COLORS[item.to_i]
        CIRCLE.colorize(colors)
        puts CIRCLE.colorize(colors)
      end```
ставит возвращает nil. Удалите его, чтобы код напоминал первый блок кода.
engineersmnky 05.08.2024 21:52
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Функция puts всегда возвращает nil, поэтому каждый элемент в p_code становится нулевым. Удалите это с конца, и все должно работать.

Ответ принят как подходящий

помещает возвращает nil, что изменяет поведение вашего метода. Для целей отладки есть p, который не меняет возвращаемое значение. Он также печатает значение в его буквальном виде (если возможно), что облегчает различение целых чисел, строк, символов и nil.

Простой пример:

a = "1"
a #=> "1"

С p:

a = p "1"
# "1"       <- prints quotes
a #=> "1"   <- retains return value

в отличие от puts:

a = puts "1"
# 1          <- omits quotes
a #=> nil    <- nil return value

Обычно вы можете просто добавить к выражению префикс p, чтобы напечатать его. Однако для сложных или многострочных выражений вам, возможно, придется добавить круглые скобки, например p( ... ).


Что касается вашего кода: вызов to_i излишен, потому что rand(1..6) уже возвращает целое число. Кроме того, вы можете переместить логику map! прямо в блок Array.new: (явный return не требуется)

def random_code
  Array.new(4) do
    color = COLORS[rand(1..6)]
    CIRCLE.colorize(color)
  end
end

Другие вопросы по теме

Как установить контекст просмотра в Rails?
Ошибка Rails 7 при запуске приложения - ошибки, связанные с Zeitwerk
Ruby on Rails: как эффективно сохранять вложенные атрибуты (рекурсивно)?
Как мне убедиться, что я загружаю только рейсы при поиске, а не загрузку начальной страницы?
Развертывание Rails Heroku не удалось: не удалось найти драгоценные камни, не удалось установить драгоценные камни через Bundler
Ошибка загрузки адаптера Active Record sqlite3. От чего зависит отсутствие драгоценного камня? не могу активировать sqlite3 (VERSION GEM) уже активирован sqlite3-версия
Есть ли команда для добавления драгоценного камня в gemspec?
Выберите диапазон даты и времени из текущей даты, а не из прошлой даты и времени
Как драгоценный камень решает, какой драгоценный камень для конкретной арки установить?
Как я могу использовать локали в своем драгоценном камне из другого драгоценного камня?