2009-10-18 4 views
2

블록 내부에서 메소드와 함수를 사용할 수있게하는 방법이 있습니까? 내가 할 노력하고있어 :Ruby 블록 내에서만 사용할 수있게 만들기

some_block do 
    available_only_in_block 
    is_this_here? 
    okay_cool 
end 

그러나 is_this_here?, okay_cool 등뿐만 아니라 그 밖에, 그 블록 내부에 접근 할 수있는. 어떤 아이디어 있니?

+0

나는 당신이 원하는 것을 이해 모르겠어요. 'okay_cool'과 회사 변수 또는 메소드입니까? 변수 인 경우 블록에서 선언하면 블록에 로컬이됩니다. – Telemachus

+0

그들은 방법입니다. –

답변

6

블록으로 사용할 수있는 메서드로 개체를 인수로 전달하십시오. 이것은 IO.open 또는 XML builder과 같이 Ruby에서 널리 사용되는 패턴입니다. 당신은 당신이 instance_eval 또는 instance_exec를 사용하여 요구 것에 가까워 질 수 있지만, 상당히 놀라운 결과를 초래할 수있는 즉, 일반적으로 나쁜 생각

some_block do |thing| 
    thing.available_only_in_block 
    thing.is_this_here? 
    thing.okay_cool 
end 

참고. 당신이 인수를 전달할 경우, 당신은 항상 당신이 참조 할 수 있습니다 알고 있지만

class Foo 
    def bar 
    "Hello" 
    end 
end 

def with_foo &block 
    Foo.new.instance_exec &block 
end 

with_foo { bar }  #=> "Hello" 
bar = 10 
with_foo { bar }  #=> 10 
with_foo { self.bar } #=> "Hello 

는 :

def with_foo 
    yield Foo.new 
end 

with_foo { |x| x.bar }  #=> "Hello" 
bar = 10 
x = 20 
with_foo { |x| x.bar }  #=> "Hello" 
+0

이것은 정확히 내가 찾던 것입니다. –