중괄호가 없는데 Ruby에서 문자열 보간이 작동하는 이유는 무엇입니까?


90

Ruby에서 문자열 보간을 사용하는 올바른 방법은 다음과 같습니다.

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

이것이 제가 항상 사용하고자하는 방식입니다.

그러나 Ruby의 문자열 보간에서 이상한 점 을 발견했습니다 . 문자열 보간은 인스턴스 변수와 관련하여 중괄호없이 Ruby에서 작동합니다. 예를 들면 :

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

그리고 비 인스턴스 변수와 동일한 것을 시도하는 것은 작동하지 않습니다.

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

1.9.2와 1.8.7 모두에서 성공을 거두었습니다.

왜 이것이 작동합니까? 여기서 통역사는 무엇을하고 있습니까?

답변:


103

Flanagan과 Matsumoto의 The Ruby Programming Language 에 따르면 :

문자열 리터럴로 보간 할 표현식이 단순히 전역, 인스턴스 또는 클래스 변수에 대한 참조 인 경우 중괄호를 생략 할 수 있습니다.

따라서 다음은 모두 작동합니다.

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"

@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"

4
멋진 질문, btw. 돌아가서 내가 잊었던 언어의 작은 구석을 찾는 것이 좋습니다.
tsherif

2
귀하의 답변에는 이유 또는 진행 상황이 포함되어 있지 않지만 그 이유를 파악하기가 어렵습니다. Matz가 자주 언급 한 오래된 게시판조차도 도움이되지 않습니다. 그러나 귀하의 답변은 우연이 아닌 기능임을 보여줍니다.
Charles Caldwell

1
나는 당신이 이유로 무엇을 기대하고 있는지 잘 모르겠습니다. 디자인 결정을 의미합니까? 제 생각에는 Ruby가 원래 Perl ++의 일종으로 생각되기 전에 Perl과 유사한 구문 에 대한 시도 였습니다.
tsherif 2012

2
나는 완전히 멍청한 사람이고 IDE가이 일을하는 것에 대해 불평했습니다. 하지만 나는 그것이 좋은 스타일이라는 것을 확신하기 위해 열심히 일하고있다. 무의미하게 일관성이없고 단점이 있습니다. 예를 들어 값이 100 인 인스턴스 변수 @distance가 있고 "# @ distancem"과 같은 표현식을 사용하여 "100m"과 같은 문자열을 만들고 싶다면 빈 문자열을 얻습니다. 인스턴스 변수 'distancem'이 없기 때문입니다. 그래서 이것은 완전히 나쁜 스타일처럼 들립니다.
terriblememory

3
@terriblememory 오, 확실히 나쁜 스타일입니다. 그래서 올바른 방법을 지적하면서 질문을 시작했습니다. 그러나 나는 그것이 언어의 특징이라는 것이 이상하다는 것을 알았고 왜 그것이 작동하는지 궁금했습니다. 다시 말하지만, 접속사로 문장을 시작하는 것도 나쁜 스타일입니다. 그러나 여기저기서 사용하는 사람들을 볼 수 있습니다. =)
Charles Caldwell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.