10
votes

Fonction intersperse dans Ruby?

Je recherche un équivalent de la fonction Haskell InsterPerse à Ruby. Fondamentalement, cela ajoutez quelque chose (comme un séparateur) entre chaque élément d'une liste. XXX

Je ne demande aucun code (je peux le faire, et je l'aurais probablement fait avant vous lisez la question). Je me demandais simplement si une fonction de ce type existe déjà sur la plate-forme rubis standard.

Mise à jour

Je ne demande aucun code, et surtout ceux qui aplatissent l'aplatir, comme cela n'a pas 'T Travail (Aplatissez-vous non seulement un niveau plat, mais tout). J'ai donné l'exemple [1,2,3] simplement comme exemple, mais cela devrait fonctionner avec xxx

(s'il vous plaît ne m'envoyez pas de code pour que cela fonctionne, Je l'ai déjà xxx

)


7 commentaires

Je suis tenté de baliser ce plz-net-envoyer-th-codez !


@andrew: Je voudrais simplement étiqueter plz-lecture-question ;-)


Aplatissez non seulement un niveau plat, mais tout - pas vrai. Vous spécifiez le niveau d'aplatissement maximum comme argument facultatif. Voir ma réponse pour un exemple.


@Jorg: Point Pris, même si toutes les réponses n'ont pas utilisé ce paramètre facultatif. Je pensais que ce n'est pas parce que le (doc) [ ruby-doc.org /core/classes/array.html#m002218] (premier coup Google) ne le mentionne pas (alors j'ai voté pour votre réponse).


Ce sont les documents pour Ruby 1.8.6 (publié 2007-03-13). Les deux rubis 1.9.0 (publiés 2007-12-28) et Ruby 1.8.7 (publiés 2008-06-01) l'ont. Voir RDOC.INFO/DOCS/RUBY-CORE/1.8.7 / Array # Flatten-instance_Method et rdoc.info /docs/ruby-core/1.9.2/array#flatten-instance_method


@Jorg: Merci, je viens de faire google et, comme aucun numéro de version n'apparaît dans l'URL, je pensais que ce serait la DOC officielle à jour à jour. Quoi qu'il en soit, nous utilisons toujours Rubi 1.8.6 au travail à certains endroits.


Demande de fonctionnalité pertinente: bugs.ruby-lang.org/issues/16946


4 Réponses :


10
votes

No


2 commentaires

Ajouterait une butée complète rendre la réponse trop verbeuse? :)


C'est vraiment la seule question qui répond à la question qui a été posée; pas la question que les gens pensaient avoir été posé. Upvoted. rejoindre est probablement le plus proche "thumatiquement".



2
votes

semble similaire à zip ...

peut-être quelque chose comme ceci: xxx

utilisation: xxx


2 commentaires

Ce n'est pas tout à fait raison. Essayez de passer autre chose que nil - il est utilisé uniquement dans la première place. Le reste par défaut à nil . Vous pouvez le réparer en utilisant itemcle.cycle


Tu as raison! Je ne peux pas croire que cela s'est assis pendant 5 ans avant que quelqu'un ait remarqué le bogue. Fixé.



7
votes

Non, pas que je sache. Mais vous pouvez toujours Vérifiez-vous .

La seule méthode similaire (en passant : Ruby est une langue orientée objet, il n'y a pas une "fonction" en ruby) est array # jointure code>, qui mappe les éléments à la chaîne et les interpare avec un séparateur. Enumérable # INTERSPERSE code> serait essentiellement une généralisation de celle-là. P>

Comme vous l'avez dit, il est trivial à mettre en œuvre, par exemple comme celui-ci: P>

class Array
  def join(sep=$,)
    map(&:to_s).intersperse(s ||= sep.to_str).reduce('', :<<)
  end
end


9 commentaires

J'aime comment la question indique explicitement pas pour poster une implémentation et seulement répondez à la question si une telle méthode existe déjà et toutes les trois réponses ignorent la demande et deux de Trois ne répondent même pas à la question :-)


Parce que lorsque les gens posent des questions comme celle-ci, elles ne semblent jamais vraiment heureuses d'une réponse "non" - et d'ailleurs, ce n'est pas assez de personnages :)


En proposant une alternative, c'est un "non" implicite. Mais qu'est-ce que c'est le plaisir de répondre à une question oui / aucune question que vous dites, peut être vérifiée dans quelques secondes?


Juste hors de curiosité, si Ruby n'a pas de fonctions, quelle est la Lambda?


@gnibbler, j'aurais été heureux avec un "non". Devinez que je dois y répondre mystériel et accepter mon propre non ;-)


@Mark, cela pourrait être vérifié dans quelques secondes, seulement si la réponse est oui. Aucune ne pas trouver dans le doc ne veut dire que rien n'existe.


@ Jörg: Pensez-vous qu'il devrait y avoir une demande de fonctionnalité pour INTERSPERSE?


@Andrew Grimm: J'y pense. J'ai aussi consulté énumérable # numérisation . En fait, je peux simplement lire l'ensemble de l'ensemble Scaladocs et Haddocks pour les bibliothèques de collections de Scala et Haskell et vérifiez laquelle de la fonctionnalité manquante est logique pour Ruby. Nous avons déjà Scala's Flatmap dans RUBY 1.9.2 AS Enumérable # Flat_map / Enumérable # Concat_Collect .


@Jorg: C'est génial, je ne suis pas sûr que mon patron (et l'équipe) sera heureux si je commence à l'utiliser.



0
votes

Je suis venu ici avec la même question et j'ai rassemblé que la réponse est toujours "non", mais je voulais rêver une mise en œuvre plus efficace. Est venu avec ces approches mutatives et non mutatives: xxx


0 commentaires