2009-11-10 17 views
17

Mam nazwany zakres takiego:Co oznacza gwiazdka przed zmienną na liście argumentów named_scope?

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

Jaka jest *item oznacza? Kiedy zadzwonię pod numer Item.find(:first, ...), to działa dobrze. Jeśli spróbuję wywołać za pomocą kolekcji, Item.find(:all, ...), to się nie powiedzie.

z innego SO pytanie, wiem podpis ma być:

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

Więc moje pytanie naprawdę jest, w jaki sposób mogę włączyć tablicę do listy argumentów oddzielone przecinkami?

UPDATE0

Od Martin Fowler nauczyłem.

(Korzystanie z „*” w liście argumentów pomaga w pracy ze zmiennymi argumentami w Ruby W liście argumentów * dyski wskazuje Jeśli mogę wywołać inną funkcję z "* dyskami", elementy tablicy dysków są przekazywane jako oddzielne argumenty.)

UPDATE1

Więcej o the "splat" operator.

Odpowiedz

18

*items oznacza, że ​​funkcja przyjmuje zmienną liczbę argumentów. Innymi słowy, jeśli nazwać to tak:

Order.by_items(item0, item1, item2) 

zmienna items wewnątrz nazwie funkcji lambda zakres zostanie tablica z 3 produktów.

Aby odpowiedzieć na prawdziwe pytanie, należy nazwać tak:

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

To magia! –

Powiązane problemy