Зависит от того, как вызывается блок. Если он вызывается с использованием ключевого слова 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
методу.