2009-11-10 2 views
17

다음과 같이 명명 된 범위가 있습니다.named_scope 인수 목록에서 변수 앞에있는 별표는 무엇을 의미합니까?

named_scope :by_items, lambda |*items| { 
    :joins => :items, 
    :conditions => ["items.id in (?)", items.map(&::id)] 
} 

*item은 무엇을 의미합니까? Item.find(:first, ...)로 호출하면 정상적으로 작동합니다. 컬렉션을 사용하여 호출하려고하면 Item.find(:all, ...)가 실패합니다.

다른 질문에서, 나는 서명이 있어야한다는 것을 알고 :

Order.by_items(item0, item1, ...) 

그럼, 내 질문 정말입니다, 어떻게 쉼표로 구분 된 인수 목록으로 배열합니까?

Martin Fowler부터 배웠습니다 :

(인수 목록에서 "*"를 사용하면 루비에서 가변 인수로 작업하는 데 도움이됩니다.) 인수 목록에서 * disks "disk"라는 배열로 전달 된 모든 디스크를 참조 할 수 있습니다. "* disks"라는 다른 함수를 호출하면 디스크 배열의 요소가 별도의 인수로 전달됩니다.)

UPDATE1

the "splat" operator에 대한 추가 정보

답변

18

*items은 함수가 가변 개수의 인수를 허용한다는 것을 의미합니다. 이 같이 호출하는 경우 즉, :

Order.by_items(item0, item1, item2) 

지정된 범위 람다 함수 내부 변수 items 3 개 항목 배열 될 것이다.

실제 질문에 대답하기 위해, 당신은 다음과 같이 호출한다 : 마법의

Order.by_items(*Item.find(:all, ...)) 
+1

을! –

관련 문제