Есть ли способ создать новый пустой Binding в Ruby? - PullRequest
0 голосов
/ 10 мая 2018

Есть ли способ создать полностью пустой объект Binding для использования с eval?

Согласно документам, только метод Kernel#binding может создавать новые привязки.Я пробовал что-то вроде этого:

empty = binding

, но затем эта привязка имеет empty среди своих локальных переменных вместе с любыми другими локальными переменными в той же области, назначенной позже в коде.

Я обнаружил, что константа TOPLEVEL_BINDING - это пустая привязка, которой достаточно для моих непосредственных целей.Хотя это может быть не всегда.

Есть ли способ создать совершенно новый, совершенно пустой Binding?

1 Ответ

0 голосов
/ 10 мая 2018

Самый простой способ - написать метод, который вызывает 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 внутри, если это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...