Ответ 1
Это зависит от того, как вызывается блок. Если он вызывается с использованием ключевого слова yield
или метода Proc#call
, то вы сможете использовать переменные экземпляра в блоке. Если он вызывается с использованием Object#instance_eval
или Module#class_eval
, тогда контекст блока будет изменен, и вы не сможете получить доступ к своим переменным экземпляра.
@x = "Outside the class"
class Test
def initialize
@x = "Inside the class"
end
def a(&block)
block.call
end
def b(&block)
self.instance_eval(&block)
end
end
Test.new.a { @x } #=> "Outside the class"
Test.new.b { @x } #=> "Inside the class"
В вашем случае похоже, что Sunspot.search
вызывает ваш блок в другом контексте с помощью instance_eval
, потому что блоку нужен легкий доступ к этому методу keywords
.