대부분은 _
IRB에서 마지막 반환 값에 대한 홀더로서 '의 특별한 의미를 알고 있지만, 이것이 제가 여기서 묻는 것이 아닙니다 .
대신 _
평범한 루비 코드에서 변수 이름으로 사용되는 경우 에 대해 묻습니다 . 여기서는 "Do n't care 변수"(à la Prolog ) 와 유사한 특별한 동작이있는 것으로 보입니다 . 다음은 고유 한 동작을 보여주는 몇 가지 유용한 예입니다.
lambda { |x, x| 42 } # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _ + 1 }.call(42) # => 43
lambda { |_, _| _ }.call(4, 2) # 1.8.7: => 2
# 1.9.3: => 4
_ = 42
_ * 100 # => 4200
_, _ = 4, 2; _ # => 2
이들은 모두 puts
추가 기능과의 충돌을 피하기 위해 IRB가 아닌 Ruby에서 직접 실행되었습니다 (가 추가 된 상태).
이 행동에 대한 문서를 어디서도 찾을 수 없기 때문에 이것은 모두 내 실험의 결과입니다 (분명히 검색하기 가장 쉬운 것은 아닙니다). 궁극적으로이 모든 것이 내부적으로 어떻게 작동하는지 궁금해서 .NET의 특별한 점을 정확히 이해할 수 있습니다 _
. 그래서 문서에 대한 참조를 요청하고, 바람직하게는 Ruby 에서 동작 하는 방식을 보여주는 Ruby 소스 코드 (및 아마도 RubySpec )를 요청합니다 _
.
lambda { |_, _| _ }.call(4, 2)
1.8과 1.9 사이의 동작 차이 가 의도하지 않은 부작용 인지 궁금합니다 . 변수 이름을 복제 할 수없는 "일반적인"상황에서와 같이 할당 된 순서는 중요하지 않습니다.