2010-06-09 2 views
19

class_eval을 모르겠다.class_eval은 어떻게 사용합니까?

class Module 
    def attr_ (*syms) 
    syms.each do |sym| 
     class_eval %{def #{sym}= (val) 
     @#{sym} = val 
     end} 
    end 
    end 
end 

%의 의미는 무엇입니까?

class_eval의 기능은 무엇입니까?

그리고 (val)은 어디서 오는가?

+0

직접 붙여 넣기를 복사했습니다 (그리고 수정되었습니다). 나는 마지막'}'이 잘못 배치되었다고 추정한다; 'val' 다음에는'end'가 아닐 것입니다. –

+0

메소드 식별자와 그 뒤에 오는 괄호 사이에 공백을 두어서는 안됩니다. 루비가 할 때 경고합니다. –

답변

23

짧은 대답은 을 피하기 위해 class_eval처럼 사용하고 싶을 것입니다.

%{hello "world"} == "hello \"world\"" # => true 

다음 %{hello} 문자열 내에서 이중 또는 단일 따옴표를 이스케이프에 대해 걱정할 필요없이, 루비 문자 문자열을 작성하는 또 다른 방법입니다

: 여기

은 코드에 대한 설명입니다 코드에서 val은 정의 할 메소드의 인수입니다.

class_eval은 정의를 수행하기 위해 작성한 텍스트를 계산 한 후이를 평가하여 몇 가지 메소드를 정의하는 데 사용됩니다. 그것은 여기서 필요하지 않습니다. 동일한 코드는 다음과 같습니다.

class Module 
    def attr_ (*syms) 
    syms.each do |sym| 
     define_method "#{sym}=" do |val| 
     instance_variable_set "@#{sym}", val 
     end 
    end 
    end 
end 

이것은 내장 attr_writer과 동일합니다.

업데이트 : 사실 당신이 인수 syms을 신뢰할 수없는 경우

class_eval 버전은 취약 ... 둘 사이에 큰 차이가있을 수 있습니다. 예를 들어 :

class Foo 
    attr_ "x; end; puts 'I can execute anything here!'; val=42; begin; val" 
end 

class_eval 버전이 인쇄됩니다 그것은 아무것도 실행할 수 있습니다 증명, 두 번 "나는 여기에 아무것도 실행할 수 있습니다." define_method 버전은 아무 것도 인쇄하지 않습니다.

type of code은 모든 설치된 Rails 앱에 대해 major vulnerability을 만드는 데 중추적 인 역할을했습니다.

+0

평가라는 단어의 의미는 무엇입니까? 나는 그 말을 듣지 않는다. –

+3

이 컨텍스트에서 일부 지침을 실행하십시오. 식 6 + 5를 "평가"하는 경우 11입니다. – ALW

관련 문제