Давайте разберем метод построчно, чтобы увидеть, что происходит.
def colorize(set, is_color_code)
colors = [] # instantiate an array
text = is_color_code ? "0" : "." # ternary assignment if is_color_code == true || false
# set.colors is an array of strings like ['white', 'white', 'white', 'white']
# set.colors.each { |color| colors.push(text.public_send(color.to_sym)) }
# line above this refactored to comment
set.colors.each do |color|
# color.to_sym # convert the string to symbol so 'white' becomes :white
# you must pass a symbol to public_send
# so this is sending the name of the color to the string as provided by the gem.
colors.push( text.public_send(color.to_sym) ) # push the return of that into array
end
# In Ruby the method always returns whatever the output of the last line returns.
colors.join(' ') # returns the colors array a string joined by spaces
end
В этом случае метод colorize определен внутри класса GameBoard
.Поэтому, когда этот метод вызывается для экземпляра GameBoard
, он будет вести себя так, как было определено.Где, как 'blue'.colorize(:blue)
здесь .colorize
метод расширяет класс String
, чтобы ответить с помощью цветовых кодов переданного символа цвета
Пример
'blue'.colorize(:blue) # same as 'blue'.blue
=>"\e[0;34;49mblue\e[0m"
Рефакторированная версия
def colorize(set, is_color_code)
text = is_color_code ? "0" : "."
set.colors
.map { |color| text.public_send(color.to_sym) }
.join(' ')
end