Я думаю, что использование eval
здесь излишне, то, что вы, вероятно, хотите, это подстановка строк:
gates["gate#{inputx}_#{inputy}"] = Gate.new(in1, in2)
Использование eval("gate#{inputx}_#{inputy}")
сначала подставляет строку, затем выполняет eval
в указанной строке: eval("gate3_4")
, поэтому он жалуется, что переменная отсутствует, потому что вы выполняете это предложение рубина gate3_4
.