Вы не можете удалить локальную переменную в Ruby. Вы можете использовать remove_class_variable, remove_instance_variable и remove_const, но вы не можете сделать это для локальных переменных.
В вашем коде вы фактически удаляете строковый объект или, по крайней мере, сборщик мусора удаляет его. Единственное, что вы держите в руках, это указатель с именем str, указывающий на ноль. Но фактический строковый объект больше не будет существовать.
Один из способов убедиться, что ваши переменные не определены, - обернуть их в Proc. Конечно, в этом есть недостаток создания Proc, и гораздо проще позволить Ruby выполнять сборку мусора. Если вы хотите использовать proc, он определит свою собственную привязку, и вы можете принудительно использовать локальные переменные, например:
Proc.new{ |;str| str = "hello"; puts str.object_id }.call
2227691880
=> nil
defined?(str)
=> nil
Имейте в виду, что Ruby является объектно-ориентированным языком программирования, поэтому проще иметь дело с переменными внутри объектов, а не беспокоиться о переменных глобальной области видимости. Если ваши переменные определены внутри функций и объектов, они остаются локальными для этих функций и объектов и прекратят свое существование после удаления объектов.