2010-03-29 3 views
2

나는 그 이름하여 하위 STR과 일치하는 valiable의 내용으로 서브 캐릭터 라인을 교체하려고 :루비 평가판 (' 1')은 가능한가요?

>> str = "Hello **name**" 
=> "Hello **name**" 
>> name = "John" 
=> "John" 

str.gsub(/\*\*(.*)\*\*/, eval('\1')) # => error! 

위 코드의 마지막 줄에 구문 오류가 있습니다. 과 : 어떤 도움이 이해할 수있을 것이다

str.gsub(/\*\*(.*)\*\*/, eval("name")) # => "Hello John" 

:

>> str.gsub(/\*\*(.*)\*\*/, '\1') 
=> "Hello name" 
>> str.gsub(/\*\*(.*)\*\*/, eval("name")) 
=> "Hello John" 

는 내가 원하는 결과입니다. 고마워!

+0

내가 완전히 여기에 질문을 이해하지 있는지 .. 당신이 명확히 주 시겠어요 사용하여 같은 일을 수행합니다. "Hello ** name **"을 "Hello John"으로 바꾸시겠습니까? –

답변

7

이 시도 :

str = "Hello **name**" 
name = "John" 
str.gsub(/\*\*(.*)\*\*/) { eval($1) } 

gsub 방법은 평가되는 블록을 받아 반환 값이 교체로 사용될 것이다. $1, $2과 같은 특수 변수는 문자열에서 \1을 사용하는 것과 동일합니다.

eval()를 사용하는 것보다 약간 더 나은 대안은 대체 값으로 Hash을 사용하는 것입니다 :

str = "Hello **name**" 
names = { "name" => "John" } 
str.gsub(/\*\*(.*)\*\*/) { names[$1] } 
+0

감사합니다! 해시 방법은 고무적입니다. – ohho

1

나는이 질문에 대한 답하지 실현,하지만 당신은 Liquid markup 살펴 보았다? 그것은 본질적으로 이중 중괄호 {{}}

@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template 
@template.render('name' => 'tobi')    # => "hi tobi" 
관련 문제