@example.each do |e| #do something here end Here I want to do something different with the first and last element in each, how should I achieve this? Certainly I can use a loop variable i and keep track if i==0 or i==@example.size but isn't that too dumb?
3 Réponses :
Une approche assez courante est la suivante (lorsqu'il n'y a certainement aucun doublure dans la matrice).
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
Cela va casser si @example code> contient des doublons.
Merci d'avoir mis à jour votre réponse @matt.
Merci pour le commentaire :) Souvent dans les rails, ce type de comportement est ciblé dans une collection de base de données, de sorte que Normalement, des doublons sont peu probables, mais depuis l'OP n'indique pas que je n'aurais certainement pas dû le supposer.
Vous pouvez utiliser alternativez, si vous préférez que vous puissiez séparer le "milieu" de la matrice comme suit: p> avec ces deux ces Méthodes Vous devez faire attention au comportement souhaité lorsqu'il n'y a qu'un ou deux éléments de la liste. P> p> chaque_with_index code>, puis utilisez l'index pour identifier les premier et les derniers éléments. Par exemple:
L'une des approches plus agréables est la suivante:
@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
C'est la même chose que la deuxième partie de la réponse @ Thomasfedb ( Stackoverflow.com/a/17135002/410102 )
@steenslag: Je ne sais pas. En quelque sorte une programmation fonctionnelle en général et Ruby Tapez sur code> en particulier est toute la colère récemment. Mais je suppose, oui, il y a une raison: la tête des variables locales, le corps et la queue cessent d'exister une fois que le travail de bloc est effectué. Cela pourrait être un avantage très mineur.
Quelqu'un peut-il s'il vous plaît signaler à la documentation sur la façon dont tête, * corps, queue = @example code> fonctionne? Plus précisément la partie * b? Merci beaucoup!
@Matt: ici , mais ils sont
C'est l'un des bits les plus malades de Ruby que j'ai vu depuis un moment. Élégant et fonctionnel (-SH).