A val
doesn Ne prenez pas d'arguments, car il est calculé et stocké dans un champ. Mais je pourrais vous renvoyer aux nombreux articles que j'ai publiés ces deux derniers jours sur les listes de diffusion. Ou plutôt, considérons-le d'un point de vue Java, puisque Scala est compatible avec Java au niveau jvm, et il doit sûrement obéir aux règles jvm. Commençons par la première classe:
abstract class X {
def expensiveOperation(p: Int => Boolean) : List[Int]
}
Maintenant, nous allons l'étendre:
abstract class Y extends X {
override val expensiveOperation: ((Int) => Boolean) => List[Int]
}
Ainsi, à partir de Java, nous savons que la classe X
a la méthode expensiveOperation
, qui reçoit Function1[Int, Boolean]
et retourne List[Int]
.
Maintenant nous allons à la classe Y
. Naturellement, il doit définir la même méthode, mais il doit également définir le getter expensiveOperation
, qui ne reçoit aucun argument et renvoie Function1[Function1[Int, Boolean],List[Int]]
.
Cela pourrait être réalisable, aussi longtemps que cette méthode supplémentaire n'existait pas en X
aussi. Alors définissons-le:
class Z extends Y {
override val extensiveOperation = new Function1[Function1[Int, Boolean], List[Int]] {
def apply(p: Int => Boolean) = List range (1, 10) filter p
}
}
Comment cela est-il défini? Est-ce que Scala copie le corps de apply
en tant que corps pour expensiveOperation
(celui qui reçoit un paramètre, pas le getter)? Cela pourrait encore être réalisable. Essayons quelque chose d'autre, si:
class W(f: ((Int) => Boolean) => List[Int]) extends Y {
override val extensiveOperation = f
}
Maintenant, comment pouvons-nous remplacer les paramètres de réception extensiveOperation
? Je suppose que nous pourrions écrire comme ceci:
override def extensiveOperation(p: Int => Boolean) = extensiveOperation.apply(p)
C'est réalisable. Mais personnellement, je pense que c'est un peu compliqué. Ma suggestion: rédiger un court SID, et obtenir un accord sur une liste de diffusion Scala. Sans code pour l'implémenter, cependant, je ne pense pas qu'il a beaucoup de chance d'être adopté - Scala doit suivre chaque fonction - tapé val
pour savoir s'il est en train de surcharger un def
ou non.
Je suis confus. Votre val ressemble à 'Function0', pas à' Function1'. Quel paramètre est-il censé prendre? En outre, il n'y a pas de court-circuit dans le val, alors pourquoi voulez-vous le faire de cette façon? Et s'il y a un court-circuit, pourquoi ne pas utiliser 'Stream' au lieu de' List'? –
Je ne comprends pas la question. Pouvez-vous expliquer plus clairement ce que vous essayez de faire, plutôt que de savoir comment vous essayez de le faire. Actuellement vous nous dites seulement la partie "Comment". –
my 'val' est une fonction1 car il s'agit essentiellement d'un pointeur vers la méthode' List.filter' (qui prend comme paramètre un 'Function1').Ma question est que je peux avoir un 'val' implémenter un' def' où 'def' ne prend pas d'arguments mais je ne vois pas pourquoi cela ne peut pas être étendu à' def's avec args? –