Проблема в том, что вы создаете новую лямбду в другой лямбде, и это создает новую область видимости.
Для большей ясности, привязка 'b' будет иметь в своей области действия все локальные переменные, доступные в области действия функции #foo_callback, и все локальные переменные, доступные в первой лямбде. Вторая лямбда, которую вы создали, - это новая область действия, и поэтому новые локальные переменные, созданные в этой области, не сохраняются за пределами области действия, если они не инициализируются вначале за пределами внутренней области.
Вот почему вы увидите, как многие люди инициализируют локальные переменные как nil перед входом в блок. Вы также можете сделать это, что делает то же самое:
country = country
{...block that sets country to something non-nil...}
return country
Переменные экземпляра не имеют этой проблемы с областью видимости и доступны во внутренней и внешней областях функции.
Пример:
b.eval("lambda {|c| @country = c}").call(country)
b.eval "instance_variables"
должно работать.
И кто-то избил меня до ответа, когда я писал это:)