Я думаю, что символы лучше всего объяснить с помощью прецедентов.
Для создания констант они более выразительны, чем целые.
def rgb(color_symbol)
return nil unless color_symbol.is_a? Symbol
case color_symbol
when :red; { r: 255, g: 0, b: 0 }
when :green; { r: 0, g: 255, b: 0 }
when :blue; { r: 0, g: 0, b: 255 }
else; { r: 0, g: 0, b: 0 }
end
end
p rgb(color_symbol= :red)
более читабельно, чем
def rgb(color_number)
return nil unless color_number.is_a? Fixnum
case color_number
when 1; { r: 255, g: 0, b: 0 }
when 2; { r: 0, g: 255, b: 0 }
when 3; { r: 0, g: 0, b: 255 }
else; { r: 0, g: 0, b: 0 }
end
end
p rgb(color_number= 2)
Для сравнения в условных выражениях символы просто сравниваются по их уникальному адресу, поэтому они более эффективны, чем строки, которые сравниваются по длине, а затем по каждому символу.
def rgb(color_string)
return nil unless color_string.is_a? String
case color_string
when "red"; { r: 255, g: 0, b: 0 }
when "green"; { r: 0, g: 255, b: 0 }
when "blue"; { r: 0, g: 0, b: 255 }
else; { r: 0, g: 0, b: 0 }
end
end
p rgb(color_string= "blue")
Это будет менее эффективно, чем использование символов.