2013-06-16 13 views

Odpowiedz

24

Jeden z ładniejszych podejść jest:

@example.tap do |head, *body, tail| 
    head.do_head_specific_task! 
    tail.do_tail_specific_task! 
    body.each { |segment| segment.do_body_segment_specific_task! } 
end 
+4

Och, wow, to jest po prostu wspaniałe. –

+1

jest to dokładnie to samo, co druga część odpowiedzi @ thomasfedb (http://stackoverflow.com/a/17135002/410102) – akonsu

+0

+1, ale dlaczego nie tylko "głowa, * ciało, ogon = @ przykład" ? – steenslag

2

Dosyć powszechne podejście jest następujące (gdy na pewno nie ma duplikatów w tablicy).

@example.each do |e| 
    if e == @example.first 
    # Things 
    elsif e == @example.last 
    # Stuff 
    end 
end 

Jeśli podejrzany tablica może zawierać duplikatów (lub jeśli po prostu wolą tę metodę), a następnie chwycić pierwsze i ostatnie elementy z tablicy i obsługiwać je na zewnątrz bloku. Przy zastosowaniu tej metody należy również wyodrębnić kod, który działa na każdej instancji do funkcji, dzięki czemu nie trzeba go powtarzać:

first = @example.shift 
last = @example.pop 

# @example no longer contains those two items 

first.do_the_function 
@example.each do |e| 
    e.do_the_function 
end 
last.do_the_function 

def do_the_function(item) 
    act on item 
end 
+0

To złamie jeśli '@ example' zawiera duplikaty. – thomasfedb

+0

Dziękujemy za zaktualizowanie swojej odpowiedzi @Matt. – thomasfedb

+0

Dzięki za komentarz :) Często w szynach tego rodzaju zachowanie jest kierowane do zbioru bazy danych, więc zwykle duplikaty są mało prawdopodobne, ale ponieważ OP nie stwierdza, że ​​na pewno nie powinienem był tego zakładać. – Matt

5

Można użyć each_with_index a następnie użyć indeksu zidentyfikować pierwszy i ostatnie przedmioty. Na przykład:

@data.each_with_index do |item, index| 
    if index == 0 
    # this is the first item 
    elsif index == @data.size - 1 
    # this is the last item 
    else 
    # all other items 
    end 
end 

Ewentualnie, jeśli wolisz można oddzielić „środku” tablicy tak:

# This is the first item 
do_something(@data.first) 

@data[1..-2].each do |item| 
    # These are the middle items 
    do_something_else(item) 
end 

# This is the last item 
do_something(@data.last) 

Z obu tych metod trzeba być ostrożnym pożądanego zachowania, gdy istnieje to tylko jedna lub dwie pozycje na liście.

Powiązane problemy