짧은 대답은 이을 피하기 위해 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을 만드는 데 중추적 인 역할을했습니다.
직접 붙여 넣기를 복사했습니다 (그리고 수정되었습니다). 나는 마지막'}'이 잘못 배치되었다고 추정한다; 'val' 다음에는'end'가 아닐 것입니다. –
메소드 식별자와 그 뒤에 오는 괄호 사이에 공백을 두어서는 안됩니다. 루비가 할 때 경고합니다. –