Rubby 호출 방법의 괄호 앞에 공백이 있으면 오류가 발생하는 이유

개시하다


루비에서 메서드가 호출되는 괄호 앞에 공백(공백)을 입력하면 오류가 발생할 수 있습니다.이 글에서 그 이유를 설명하다.

환경을 확인하다


이 글의 내용은 다음과 같은 환경에서 확인했다.
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

사절하다


이 글은 개념 단계(이미지 단계)가 오류를 초래하는 원인을 설명했다.
이것은 Rubby Parer 동작을 정확하게 반영하는 설명이 아니니 미리 양해해 주십시오.

오류 발생 및 오류 없음 확인


매개 변수가 표준 출력의 값puts으로 전달되는 것을 표시하는 방법에서 여러 개의 매개 변수를 전달할 수 있다.
두 개 이상의 매개 변수를 지정하면 변수의 내용과 줄 바꾸기가 출력을 교체합니다.
puts 1, 2, 3
#=> 1
#   2
#   3
물론 방법이 호출되는 괄호를 붙일 수도 있다.
puts(1, 2, 3)
#=> 1
#   2
#   3
그러나 괄호 앞에 공백이 있으면 오류가 발생할 수 있습니다.
puts (1, 2, 3)
#=> Traceback (most recent call last):
#           1: from /Users/jnito/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
#   SyntaxError ((irb):3: syntax error, unexpected ',', expecting ')')
#   puts (1, 2, 3)
#          ^
그럼 괄호 앞에 빈칸이 있으면 틀릴까요?
다음 코드는 정상적으로 실행될 것입니다.
puts (1 + 2 + 3)
#=> 6
puts (1, 2, 3)가 잘못되고 puts (1 + 2 + 3)가 되지 않는 이유는 무엇입니까?

괄호 앞에 공백이 있으면 "공식을 그룹화한 괄호"로 해석됩니다.


이 이유는 간단히 말해서 루비의 경우 괄호 앞에 공간이 있다면 방법이 호출된 괄호가 아니라'공식을 그룹화한 괄호'다.
더 나아가 puts (1, 2, 3)puts (1 + 2 + 3)의 상태는 방법이 호출한 괄호와 생략된 것과 같다.
생략을 보충하는 방법은 괄호를 호출한 후 위의 코드는 다음과 같다.
# putsの第1引数に(1, 2, 3)を渡す
puts((1, 2, 3))

# putsの第1引数に(1 + 2 + 3)を渡す
puts((1 + 2 + 3))
이때 괄호 안의 내용이 되돌아오는 값의'공식'이면 문법 오류가 발생하지 않고 정상적으로 실행할 수 있다(이 괄호는'조합 공식의 괄호'이기 때문이다).
그러나 1, 2, 3는 식이 아니다.irb에만 입력1, 2, 3해도 문법 오류가 발생할 수 있습니다.
1, 2, 3
#=> Traceback (most recent call last):
#           1: from /Users/jnito/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
#   SyntaxError ((irb):1: syntax error, unexpected ',', expecting end-of-input)
#   1, 2, 3
#    ^
따라서 puts (1, 2, 3) 괄호 내용은 공식이 아니어서 문법 오류가 발생한다.
한편, 1 + 2 + 3는 공식이기 때문에 수치를 되돌려준다.
1 + 2 + 3
#=> 6
따라서 puts (1 + 2 + 3) 괄호의 내용은 공식이기 때문에 문법적으로 틀리지 않고 puts 방법의 매개 변수6로 전달된다.

발전


그럼 다음 두 코드가 어떤 결과인지 아세요?
puts (1 + 2 + 3) * 4
puts (1 + 2 + 3), 4
puts (1 + 2 + 3) * 4(1 + 2 + 3) * 4 중의 공식으로 이것이 첫 번째 매개 변수이다.
생략된 괄호를 보충하는 것은 다음과 같다.
puts((1 + 2 + 3) * 4)
이런 상황에서 (1 + 2 + 3) * 4의 결과만 puts의 매개 변수이기 때문에 출력은 다음과 같다24.
puts (1 + 2 + 3) * 4
#=> 24
한편, puts (1 + 2 + 3), 4(1 + 2 + 3)는 첫 번째 파라미터이고, 4는 두 번째 파라미터이다.
쓴 것puts((1 + 2 + 3), 4)과 같은 것이다.
따라서 출력은 다음과 같다64.
puts (1 + 2 + 3), 4
#=> 6
#   4

발전의 두 번째


그럼 이제 아까 코드에서 괄호 앞 공간을 빼면 어떨까요?
puts(1 + 2 + 3) * 4
puts(1 + 2 + 3), 4
실제로 이 두 코드는 모두 정상적으로 집행할 수 없다.
나는 다음에 그 이유를 설명한다.puts(1 + 2 + 3) * 4 다음과 같이 실행할 때 오류가 발생할 수 있습니다(문법상 오류가 없지만 실제 실행 후 끝까지 정상적으로 실행할 수 없습니다).
puts(1 + 2 + 3) * 4
#=> 6
#   Traceback (most recent call last):
#           2: from /Users/jnito/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
#           1: from (irb):8
#   NoMethodError (undefined method `*' for nil:NilClass)
우선 puts(1 + 2 + 3)가 실행되고 이어서 puts 방법의 반환값nil에 대한 집행* 4이 이루어졌기 때문에 루비에게 "nil * 4 집행할 수 없다nil, 방법이 정의되지 않았다"는 욕을 먹어 오류가 발생했다.
다른 한편, *는 다음과 같은 문법 오류가 발생할 수 있다.
puts(1 + 2 + 3), 4
#=> Traceback (most recent call last):
#           1: from /Users/jnito/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
#   SyntaxError ((irb):9: syntax error, unexpected ',', expecting end-of-input)
#   puts(1 + 2 + 3), 4
#                  ^
puts(1 + 2 + 3), 4 의식이 끝난 뒤 곧이어 puts(1 + 2 + 3) 나왔기 때문이다., 4 부분은 루비의 문법을 해석할 수 없기 때문에 문법 오류가 발생할 수 있습니다.

총결산


따라서 이 글에서 루비는 괄호 앞에 들어갈 때 오류가 발생하는 방법을 설명했다.
내가 집필한 전문가가 되기 위한 루비 입문.에는 이 내용을 거의 설명하지 않았기 때문에 예상치 못한 잘못으로 괴로워하는 사람들이 종종 있다(설명이 부족해서 미안하다.
이 글에서 설명한 바와 같이 Ruby가 괄호 앞에 공간이 있는지의 여부는 프로그램의 해석 방법에 큰 변화가 있다.
"분명히 책의 내용대로 코드를 잘 입력했는데 왜 오류가 났을까!"이렇게 하면 괄호 앞에 빈칸이 있는지 확인하세요.

참고 문헌


이 글의 설명은 책'프로그래밍 언어 Rubby의 6.3.2항'필수 괄호'의 내용을 참고했다.

좋은 웹페이지 즐겨찾기