Самый простой способ - написать метод, который вызывает binding
и ничего больше:
def empty_binding
binding
end
Тогда:
b = empty_binding
b.local_variables
# [ ]
Эта привязка будет по-прежнему иметь self
и доступ к любым переменным экземпляра, доступным для этого self
. Вы можете ограничить это с помощью некоторого chicanery:
module Empty
def self.binding
super
end
end
b = Empty.binding
b.eval('puts local_variables.inspect')
# [ ]
b.eval('puts instance_variables.inspect')
# [ ]
b.eval('puts self.inspect')
# Empty
То, что работает, зависит от цели. Связывание без локальных переменных довольно просто, связывание без чего-либо вообще, вероятно, невозможно без взлома самого Ruby (хотя BasicObject
может быть полезно, чтобы немного приблизиться к пустому, чем модуль).
Ничто из этого не дает вам тюрьму для безопасного eval
внутри, если это то, что вы ищете.