Je me demandais quel était le mot réservé de Kotlin, infixe, alors j'ai recherché la définition et comment la créer.
En premier lieu. Qu'est-ce qu'un infixe? Je ne connais pas les mots anglais (rires) Lorsque j'exécute la traduction Google, il renvoie "à l'intérieur". J'ai remarqué ici que c'est l'un des correctifs. Il existe d'autres correctifs que j'utilise souvent. prefix、suffix。 Littéralement au milieu, c'est une fonction de Kotlin qui peut définir une fonction qui met une fonction d'infixe entre des objets et des valeurs et des processus avec deux objets et valeurs en sandwich comme arguments.
La fonction infixe to
de la bibliothèque standard est appelée comme suit pour créer une instance Pair
.
Pair.kt
val pair: Pair<String, String> = "key" to "value"
La méthode est définie comme une fonction d'extension comme indiqué ci-dessous.
Standard.kt
/**
* Creates a tuple of type [Pair] from this and [that].
*
* This can be useful for creating [Map] literals with less noise, for example:
* @sample samples.collections.Maps.Instantiation.mapFromPairs
*/
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
Référence: Tuples.kt
Ensuite, j'aimerais créer ma propre fonction d'infixe.
Imaginez un cas que vous rencontrez souvent, «remplissant des valeurs dans des instances d'objets similaires qui ont des objets similaires».
Ici, créez une fonction qui attache une séquence d'historique à la valeur de la classe Customer
pour créer une instance de la classe CustomerHistory
, et retourne une instance Pair
qui inclut ces instances dans les génériques.
Tout d'abord, définissez la classe de données qui sera le résultat de l'entrée et de la synthèse.
Data.kt
data class Customer (
var id: String,
var name: String
)
data class CustomerHistory (
var id: String,
var name: String,
var seq: Int
)
Définissez la fonction d'infixe qui crée une instance CustomerHistory
avec une séquence à partir du matériau d'origine Customer
comme suit.
Infix.kt
/**
*Le récepteur est traité comme cela dans la fonction d'extension. La séquence est reçue en tant qu'argument de la fonction.
*/
infix fun Customer.mapToHistory(seq: Int): Pair<Customer, CustomerHistory> = Pair(
this,
CustomerHistory(
this.id,
this.name,
seq
)
)
Vous êtes maintenant prêt. Maintenant, appelons la fonction infixe définie à partir du code Kotlin et du code Java.
Appelez la fonction d'infixe personnalisée définie ci-dessus.
Caller.kt
//Ancienne histoire.
val customer: Customer = Customer("00001", "Eron Musk")
//Renvoie le matériau d'origine et la paire de l'objet historique avec une séquence.
val pair: Pair<Customer, CustomerHistory> = customer mapToHistory 2
La fonction définie n'était pas un bon exemple et elle est difficile à comprendre, mais vous pouvez obtenir le résultat en plaçant la fonction définie entre les objets et les valeurs.
En raison de l'interopérabilité de Kotlin, il peut également être appelé depuis Java. Si vous essayez un extrait d'un appel similaire en Java
Caller.java
/**
*La valeur de retour est kotlin inclus dans la bibliothèque de Kotlin..Importez et définissez Pair.
*/
public static void printHistory(Customer customer) {
Pair<Customer, CustomerHistory> customerHistory = InfixKt.mapToHistory(customer, 2);
}
Après tout, je m'y attendais, mais du point de vue de Java, la fonction infixe est une méthode statique.
Le fichier Kotlin défini a été compilé avec kotlinc
.
Je peux presque imaginer la procédure d'instruction en regardant l'appel de Java, mais je suis curieux. Alors, réassemblons le fichier Kotlin compilé (fichier de classe).
mac:classes user$ javap InfixKt.class
Compiled from "Infix.kt"
public final class InfixKt {
public static final kotlin.Pair<Customer, CustomerHistory> mapToHistory(Customer, int);
}
Comme prévu ... Les fichiers Kotlin sans classes ou classes multiples sont nommés \
2020-07-02: Addendum C'est une méthode statique car la fonction que j'ai créée est une fonction d'extension.
Ajoutez une option à javap
et essayez de produire des informations un peu plus détaillées.
mac:classes user$ javap -c -l -p InfixKt.class
Compiled from "Infix.kt"
public final class InfixKt {
public static final kotlin.Pair<Customer, CustomerHistory> mapToHistory(Customer, int);
Code:
0: aload_0
1: ldc #10 // String $this$mapToHistory
3: invokestatic #16 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: new #18 // class kotlin/Pair
9: dup
10: aload_0
11: new #20 // class CustomerHistory
14: dup
15: aload_0
16: invokevirtual #26 // Method Customer.getId:()Ljava/lang/String;
19: aload_0
20: invokevirtual #29 // Method Customer.getName:()Ljava/lang/String;
23: iload_1
24: invokespecial #33 // Method CustomerHistory."<init>":(Ljava/lang/String;Ljava/lang/String;I)V
27: invokespecial #36 // Method kotlin/Pair."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
30: areturn
LineNumberTable:
line 12: 6
line 13: 10
line 14: 11
line 15: 15
line 16: 19
line 17: 23
line 14: 24
line 12: 27
line 19: 30
LocalVariableTable:
Start Length Slot Name Signature
0 31 0 $this$mapToHistory LCustomer;
0 31 1 seq I
}
Après tout, il semble que ce soit un code d'opération Java que je connaissais même après sa compilation.
――Infixe est un mot qui fait référence à l'inscription et revient à être placé entre des préfixes / suffixes.
Livres Kotlin en action
site Internet [Notation interne - référence Kotlin](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/functions.html#%E4%B8%AD%E7%BD%AE%E8% A8% 98% E6% B3% 95)