한 번에 하나씩 살펴 보겠습니다. method_missing
을 완전히 가져와야합니다. 혼란 스러울 정도로 진행되기 때문입니다. 실제로는 완전히 관련이 없습니다.
스 플랫 *
은 2 가지를 수행합니다. 정의의 인수 인에서는 여러 인수를 배열에 흡수합니다. 메서드 호출에서 사용되는 경우 배열을 개별 인수로 분리합니다. 둘 다 사용하면 다른 수의 인수에 전달할 수 있습니다.
def foo(*args)
bar(*args)
end
def bar(a, b, c)
puts a
puts b
puts c
end
foo(1,2,3) # prints 1, 2 and then 3
기본적으로 모든 인수를 전달하므로 동일한 패턴입니다.
&
은 block 인수입니다. 메서드 호출 당 정확히 하나가있을 수 있습니다. 끝에서 멈추는 블록입니다. 그것은 논쟁을 직접적으로 진행하지 않는다는 점에서 특별한 논증입니다. 메서드 정의에서 마지막 인수로 &someblock
을 캡처하여 변수에 블록을 캡처 할 수 있습니다.
그런 다음 동일한 구문을 사용하여 호출에서 블록을 전달할 수 있습니다.
이렇게하면 걸지 블록을 호출하지 않고 다른 방법으로 전달할 수 있습니다. 일반적으로 통과 된 블록을 실행하려면 보통 yield
을 사용해야하기 때문에 항상 필요한 것은 아닙니다. 그러나 당신이 그것을 실행하는 것 이외의 것을하고 싶다면 블록 자체에 대한 참조를 포착해야합니다.
이렇게 두 가지를 결합하면 궁극적 인 방법 전달자가됩니다. 모든 인수와 모든 블록을 끝까지 캡처하여 다른 메소드로 보냅니다.
# forwards everything to the method `bar`
def foo(*args, &block)
bar(*args, &block)
end
마지막으로, send
는 방법입니다. 메소드의 이름 다음에 인수 (배열이 아님)가 올 것으로 예상되며 교수형 블록을 선택적으로 처리 할 수 있습니다. 즉
: 플랫 그냥 방법 매개 변수 정의/인수 목록에 적용되지 않습니다
foo.send methodName, *args, &block
참고. 또한 블록 매개 변수 정의/인수 목록, * 및 * 할당에도 적용됩니다. –