Доступ к локальным переменным из другой привязки в Ruby - PullRequest
4 голосов
/ 06 июля 2011

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

# define a variable in this scope, such as
x = 5
Foo.explore_locals  # inside the Foo#explore_locals method, access x

, где Foo - некоторый внешний модуль.Идея состоит в том, чтобы красиво отображать и экспортировать локальные переменные.

Что должно быть внутри метода explore_locals?Есть ли способ сделать это возможным?Если это абсолютно необходимо, я думаю, это может быть

Foo.explore_locals binding

, но это гораздо менее элегантно для приложения, которое я имею в виду.

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Жаль, что нет встроенного способа получить привязку звонящего. Блочная уловка, кажется, обычный ответ на этот вопрос.

Однако есть еще одна «хитрость», существовавшая для более старых версий Ruby 1.8, которая называется binding_of_caller. Похоже, Quix портировал его на 1,9. Вы можете проверить это:

https://github.com/quix/binding_of_caller

1 голос
/ 06 июля 2011

Вот пример (но он требует дополнительных скобок {}, которых я бы предпочел избежать, если это возможно):

module Foo
  def self.explore_locals &block
    p block.binding.eval 'local_variables'
  end
end

local_1 = 3
Foo.explore_locals{}  # shows [:local_1, :_]
...