2009-03-20 5 views
2
,

이 연결의 작업 순서는 무엇입니까?

Symbol 

하지만 그것을 변경하는 경우 약간 + 대신 안녕하세요 세계 문자열을 분리하는 공간의 사용 :

x = "hello" " world".to_sym 
puts x.class 
의 의 이 작동하고 있습니다

나 출력을 생산하는 심볼로 두 문자열을 연결하는 오류가 발생합니다 :

x = "hello" + " world".to_sym 
puts x.class 

다음과 같은 오류가 발생합니다. "hello"문자열에 연결하기 전에 "world".to_sym 호출을 다시 캐스팅하려고하기 때문입니다.

in `+': can't convert Symbol into String (TypeError) 

첫 번째 예제가로 작동하게하는 것은 무엇입니까? 누구든지 작업 순서가 무엇인지 알고 있습니까? 나는 두 개의 문자열이 실제로 하나로서 다루어지고, 그 사이의 공간은 무시되고 to_sym 메서드가 호출되기 전에 연결된 것으로 의심된다. 실제로 "hello"와 "world"의 내용을 결합하려고 시도하기 전에 to_sym이 "world"문자열에서 호출 될 것이라고 생각했기 때문에 두 번째 예제와 다르게 작동 할 것으로 예상했습니다.

답변

1

두 개 이상의 문자열 리터럴이 바로 옆에 놓여 있으면 즉시 단일 문자열 리터럴로 처리됩니다. 루비 인터프리터가 토큰에 코드를 변환 할 때, 그것은 하나의 토큰 string "hello world"

"hello" " world" 

을 변환하고 그것을

"hello" + " world" 

3 토큰으로 변환 : string "hello", method +string " world"을. 그런 다음 실제로 코드를 실행할 때 문자열을 나중에 연결합니다.

4

첫 번째 예는 일반적으로이 같이 작성을 참조 문법 설탕입니다. 두 번째 예제에서는 문자 그대로 호출 :

x = "hello".+("world".to_sym) 

분명히 인수로 기호 유용한 아무것도 할 수 없습니다 String#+ 때문에 작동하지 않을된다. 당신이 "hello world".to_sym을 수행하려는 경우 짧은에서

는 첫 번째를하지 않고 그냥 그럼 그냥 괄호를 사용하는 어떤 이유에서 그런 식으로 쓸 수 없습니다 : ("hello" + " world").to_sym