Основное различие между Ruby и другими языками, к которым вы можете привыкнуть (например, C / C ++), заключается в том, что перед выполнением программа на C / C ++ обрабатывается компилятором, который сопоставляет использование переменных / функций с их определениями. Программы на Ruby просто выполняются сверху вниз, по одному утверждению за раз. Поэтому, когда выполняется строка, которая ссылается на Block.FIRST
, интерпретатор Ruby не может «смотреть вперед» в программном коде и посмотреть, какое значение будет присвоено Block.FIRST
позже. Он ничего не знает о том, что будет позже; он знает только то, что выполнил до сих пор.
Возможно, одной из самых сильных характеристик Ruby является то, что почти все является динамическим и может быть изменено во время выполнения. Если вы пришли из C / C ++, это первое, что вам нужно, чтобы разобраться в Ruby. Например, константы в Ruby могут быть назначены условно:
class Block
if rand % 2 == 0
FIRST = '.'
else
FIRST = '$'
end
end
Если интерпретатору Ruby требовалось «смотреть вперед», чтобы увидеть, каким должно быть значение Block.FIRST
, что он должен прогнозировать в приведенном выше случае?
Это концептуальный переход от того, к чему вы привыкли, и он потребует от вас структурирования ваших программ по-другому, и подумает о ваших программах по-другому. Если вы попытаетесь написать C / C ++ / Java на Ruby, вы будете сражаться до конца.
В этом случае я рекомендую вам просто изменить порядок ваших определений и перейти "снизу вверх". Есть и другие способы достижения того же эффекта, но это самый простой способ.