Ruby에서 변수를 문자열로 병합하는 더 좋은 방법을 찾고 있습니다.
예를 들어 문자열이 다음과 같은 경우 :
는 " "animal
action
second_animal
animal
, action
및에 대한 변수 second_animal
가 있습니다. 해당 변수를 문자열에 넣는 가장 좋은 방법은 무엇입니까?
답변:
관용적 인 방법은 다음과 같이 작성하는 것입니다.
"The #{animal} #{action} the #{second_animal}"
문자열을 둘러싼 큰 따옴표 ( ")에 유의하십시오. 이것은 Ruby가 내장 된 자리 표시 자 대체를 사용하는 트리거입니다. 작은 따옴표 ( ')로 대체 할 수 없습니다. 그렇지 않으면 문자열이 그대로 유지됩니다.
sprintf와 유사한 형식을 사용하여 문자열에 값을 삽입 할 수 있습니다. 이를 위해 문자열에는 자리 표시자가 포함되어야합니다. 인수를 배열에 넣고 다음 방법 중 하나를 사용하십시오. (자세한 내용 은 Kernel :: sprintf 설명서를 참조하십시오 .)
fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal] # using %-operator
res = sprintf(fmt, animal, action, other_animal) # call Kernel.sprintf
인수 번호를 명시 적으로 지정하고 서로 섞을 수도 있습니다.
'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']
또는 해시 키를 사용하여 인수를 지정하십시오.
'The %{animal} %{action} the %{second_animal}' %
{ :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}
%
연산자에 대한 모든 인수의 값을 제공해야합니다 . 예를 들어 animal
.
#{}
다른 답변에서 언급했듯이 생성자를 사용합니다 . 나는 또한 여기서 조심해야 할 진짜 미묘함이 있음을 지적하고 싶다.
2.0.0p247 :001 > first_name = 'jim'
=> "jim"
2.0.0p247 :002 > second_name = 'bob'
=> "bob"
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
=> "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
=> "jim bob" #correct, what we expected
에 의해 입증 된 바와 같이 문자열 (따옴표로 생성 될 수 있지만 first_name
및 last_name
변수 생성자는 큰 따옴표로 문자열을 사용할 수 있습니다.#{}
이를 문자열 보간이라고하며 다음과 같이 수행합니다.
"The #{animal} #{action} the #{second_animal}"
중요 : 문자열이 큰 따옴표 ( "") 안에있을 때만 작동합니다.
예상대로 작동하지 않는 코드의 예 :
'The #{animal} #{action} the #{second_animal}'
표준 ERB 템플릿 시스템이 시나리오에 적합 할 수 있습니다.
def merge_into_string(animal, second_animal, action)
template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
ERB.new(template).result(binding)
end
merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"
merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"
다음과 같이 지역 변수와 함께 사용할 수 있습니다.
@animal = "Dog"
@action = "licks"
@second_animal = "Bird"
"The #{@animal} #{@action} the #{@second_animal}"
출력은 다음과 같습니다. "The Dog licks the Bird "