Ruby : 변수를 문자열로 병합


95

Ruby에서 변수를 문자열로 병합하는 더 좋은 방법을 찾고 있습니다.

예를 들어 문자열이 다음과 같은 경우 :

는 " "animal actionsecond_animal

animal, action및에 대한 변수 second_animal가 있습니다. 해당 변수를 문자열에 넣는 가장 좋은 방법은 무엇입니까?

답변:


240

관용적 인 방법은 다음과 같이 작성하는 것입니다.

"The #{animal} #{action} the #{second_animal}"

문자열을 둘러싼 큰 따옴표 ( ")에 유의하십시오. 이것은 Ruby가 내장 된 자리 표시 자 대체를 사용하는 트리거입니다. 작은 따옴표 ( ')로 대체 할 수 없습니다. 그렇지 않으면 문자열이 그대로 유지됩니다.


2
죄송합니다. 문제를 너무 단순화 한 것 같습니다. 문자열은 데이터베이스에서 가져 오며 변수는 여러 요인에 따라 달라집니다. 일반적으로 1 개 또는 2 개의 변수에 대해 대체를 사용하지만 이것은 더 많은 가능성이 있습니다. 이견있는 사람?
FearMediocrity

# {} 구조가 아마도 가장 빠를 것입니다 (여전히 나에게는 반 직관적 인 것처럼 보이지만). gix의 제안과 마찬가지로 + 또는 <<로 문자열을 어셈블 할 수도 있지만 중간 문자열이 생성되어 비용이 많이들 수 있습니다.
Mike Woodhouse

가장 좋은 방법은 보간 변수
Dragutescu Alexandru

115

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.


18

#{}다른 답변에서 언급했듯이 생성자를 사용합니다 . 나는 또한 여기서 조심해야 할 진짜 미묘함이 있음을 지적하고 싶다.

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_namelast_name변수 생성자는 큰 따옴표로 문자열을 사용할 수 있습니다.#{}


13
["The", animal, action, "the", second_animal].join(" ")

그것을하는 또 다른 방법입니다.


10

이를 문자열 보간이라고하며 다음과 같이 수행합니다.

"The #{animal} #{action} the #{second_animal}"

중요 : 문자열이 큰 따옴표 ( "") 안에있을 때만 작동합니다.

예상대로 작동하지 않는 코드의 예 :

'The #{animal} #{action} the #{second_animal}'

새로운 프로그래머가 배울 수있는 적절한 용어 인 보간을 사용해 주셔서 감사합니다.
Mike Bethany

3

표준 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"

0

다음과 같이 지역 변수와 함께 사용할 수 있습니다.

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

출력은 다음과 같습니다. "The Dog licks the Bird "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.