8
votes

Discriminer premier et dernier élément de chacun?

@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? 

0 commentaires

3 Réponses :


2
votes

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


3 commentaires

Cela va casser si @example 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.



5
votes

Vous pouvez utiliser chaque_with_index , puis utilisez l'index pour identifier les premier et les derniers éléments. Par exemple: xxx

alternativez, si vous préférez que vous puissiez séparer le "milieu" de la matrice comme suit: xxx

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.


0 commentaires

25
votes

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


5 commentaires

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 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 fonctionne? Plus précisément la partie * b? Merci beaucoup!


@Matt: ici , mais ils sont Toujours quereller . Vous aurez également besoin de quelques livres de papier sur Ruby et non seulement comme symbole d'état.


C'est l'un des bits les plus malades de Ruby que j'ai vu depuis un moment. Élégant et fonctionnel (-SH).