Ruby интерпретирует keys[0]
и остальные строки 5 как локальные переменные, поскольку он видел keys = ...
.Существует двусмысленность в грамматике Ruby, когда речь идет о дифференцировании локальных переменных от вызовов методов без аргументов, что устраняется неоднозначностью из-за этой эвристики.то есть, если синтаксический анализатор видит присваивание этому идентификатору, то является локальной переменной, если не является вызовом метода.
Вы можете решить эту проблему, обратившись к self.keys.дать понять, что вы хотите использовать метод доступа.
class Klass
attr_accessor :keys
def change_keys(opt)
if opt == 1
self.keys = [keys[0], keys[keys.length - 1]]
else
tmp = keys[0]
keys[0] = keys[keys.length-1]
keys[keys.length-1] = tmp
end
keys
end
end
klass = Klass.new
klass.keys = [1,2,3,4,5]
puts klass.change_keys(1)
puts klass.change_keys(2)