블록

2012-05-13 2 views
6

이의 우리는 두 가지 자원을 가지고 있다고 가정 해 봅시다 방법 (요리사 자원)를 참조하지 않습니다. 그러나 내가 recipe에서 proc을 정의하면 owner, group 등의 NoMethodError가 발생합니다. 왜 그런 일이 발생합니까? 어휘 적 범위는 다르지 않은가? 결과적으로 self.instance_eval &common_cfg을 사용해야합니다.블록

common_cfg = Proc.new { 
    owner 'root' 
    group 'root' 
} 

template 'template1' do 
    common_cfg.call 
end 

template 'template2' do 
    common_cfg.call 
end 
+0

당신이 그것을 글로벌 ('$의 common_cfg') 할 경우 오류가 발생합니까입니까? –

+0

NoMethodError가 proc (소유자, 그룹 등)의 컨텍스트에서 발생하기 때문에 proc 변수가 잘 평가됩니다. – m33lky

+0

Oh; gotcha - 댓글을 삭제합니다. –

답변

2

쉐이크가 어떻게 구현 되었기 때문에 (리플렉션이 많은지)이를 보호하기 위해 라이브러리 또는 루비 블록 리소스에 넣어야합니다. 나는 범위 밖에있을 것이기 때문에 루비 블록 리소스가 작동한다고 생각한다.

http://wiki.opscode.com/display/chef/Libraries

보통 이런 이유로 관용구는

["file_one","file_two"].each do |file| 
    template file do 
    owner "root" 
    group "root" 
    end 
end 
+0

두 번째 링크가 끊어졌습니다. – Eye

+0

더 이상 관련이 없으므로 @ 눈이 제거되었습니다. – EnabrenTane