Я работаю над базовым проектом вдохновителя со случайным выбором цветов, и пользователь должен его угадать.
Проблема в карте! должен проходить через каждый элемент и карту! редактирует значения исходного массива. Но здесь, в первую очередь, он работает так, как задумано, меняя свои числовые значения на значения на основе хеша, где каждое число представляет такой цвет:
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 обладает сборщиком мусора для автоматического управления памятью.
Функция 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