Je cherche à étendre l'itérateur pour créer une nouvelle méthode Mon problème est ce qui est le meilleur Pratique pour étendre l'itérateur pour retourner un nouvel itérateur que j'aimerais être paresseux évalué. Venant d'un arrière-plan C # I Utilisation normale pour Exemple que je pourrais avoir p> donc dans ce cas, le jusqu'à présent que j'ai: p> à prendre en main code>, qui fonctionnera comme
à l'épreuve code> mais inclure le dernier élément.
iEnumerable code> et utilisez le mot-clé code> de rendement code>, mais une telle option n'apparaît pas exister dans Scala. P>
primé à prendre en charge code> n'aurait que résoudre le prédicat sur les valeurs jusqu'à ce que je reçois un résultat supérieur à 6 , et il inclura ce premier résultat p>
5 Réponses :
scala> def timeConsumeDummy (n: Int): Int = { | println ("Time flies like an arrow ...") | n } timeConsumeDummy: (n: Int)Int scala> List(0,1,2,3,4,5,6,7).toStream.filter (x => timeConsumeDummy (x) < 6) Time flies like an arrow ... res14: scala.collection.immutable.Stream[Int] = Stream(0, ?) scala> res14.take (4).toList Time flies like an arrow ... Time flies like an arrow ... Time flies like an arrow ... res15: List[Int] = List(0, 1, 2, 3)
Désolé, l'exemple n'est pas le cas spécifique que je cherche à résoudre, je comprendrai un exemple plus approfondi pour illustrer ce que je suis après
@Jpullar: Votre prise (2) a disparu et a changé de place avec (_ <6), tandis que le TimeconsumingMethod est à gauche de (_ <6) maintenant. Ainsi, (TimeconsumingMethod) produit un INT en résultat, ce qui est comparé à (_ <6) maintenant, ou est-ce l'élément de liste initiale, qui doit être inférieur à 6?
Ce que votre projection est correcte et ce que je suis après dans l'évaluation paresseuse. Mon problème, cependant, consiste à imiter la manière dont la fonction de filtre est évaluée paresseusement dans une méthode d'extension personnalisée
Donc, si TIMECONSUMEDY code> retourne
2 * N - 1 code>, tous les calculs sont effectués, c'est vrai.
Vous pouvez utiliser la méthode maintenant span code> de
itérateur code> pour le faire assez proprement:
(0 jusqu'à 10 ) .toalerator.Tolat-questionné (_ <4) .tolist code> donne
Liste (0, 1, 2, 3, 4) code>, par exemple. P> P>
La dernière ligne de votre méthode peut être écrite plus succinctement que a ++ (b prendre 1) code>
object ImplicitIterator { implicit def extendIterator[T](i : Iterator[T]) = new IteratorExtension(i) }
C'était là que ma pensée se dirigeait, merci d'y arriver pour moi! Il offre une bonne approche généralisée. Je souhaite qu'il y ait une solution générale plus élégante puis de construire un nouvel itérateur.
Ceci est un cas où je trouve la solution mutable supérieure:
Ceci est définitivement une solution élégante à mon problème, acclamations!
Je prendrai la version fonctionnelle avec ni var code> s ni
val code> s, merci!
@OXBOW_LAKES - Si cela ne vous dérange pas des frais généraux supplémentaires, c'est une alternative fine. (Normalement, je n'utiliserais pas un Val pour la fonction; J'essayais simplement de séparer les choses pour plus de clarté.)
C'était plus le var code> je vous ai opposé! Et je n'étais pas particulièrement sérieux de toute façon
Les éléments suivants nécessitent Scalaz pour obtenir ici il est au travail: < / p> Vous pouvez rouler votre propre pli sur une paire comme ceci: p> plier code> sur un tuple
(a, b) code>
Avez-vous eu un coup d'oeil au flux?
Un flux pourrait certainement être plus approprié ici dans l'exemple, mais j'ai toujours le même problème autour de la meilleure façon de construire la méthode de l'extension
Oh,
Main-à-Maître code>. Mon ancien
Taketo code>
....