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

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

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

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```

🤔 А знаете ли вы, что...
Ruby обладает сборщиком мусора для автоматического управления памятью.


51
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