Kotlin의 stdlib에 대한generated

12278 단어 Kotlin

stdlib, 확장 함수 및 집합


Kotlin의 stdlib는 거의 확장 함수의 집합이지만 Java는 기본형이 있어 형식 매개 변수로 처리할 수 없기 때문에 집합에 확장 함수를 쓰려면 다음과 같이 하십시오. 형식 매개 변수,byte,short,int,long,float,double,booleanchar에 유사한 코드를 반복해서 써야 합니다.
/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun <T> Array<out T>.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun ByteArray.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun ShortArray.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun IntArray.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun LongArray.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun FloatArray.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun DoubleArray.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun BooleanArray.isEmpty(): Boolean {
    return size == 0
}

/**
 * Returns `true` if the array is empty.
 */
@kotlin.internal.InlineOnly
public inline fun CharArray.isEmpty(): Boolean {
    return size == 0
}

stdlib 코드 생성


따라서 Kotlin의 stdlib는 템플릿에서 집합에 사용되는 확장 함수 코드를 생성하고 생성된 코드는 libraries/stdlib/src/genereted/에 놓는다.

예를 들어 위의 isEmpty 템플릿은 libraries/tools/kotlin-stdlib-gen/src/templates/Arrays.kt 에서 다음과 같이 정의됩니다.
templates add f("isEmpty()") {
    inline(Inline.Only)
    only(ArraysOfObjects, ArraysOfPrimitives)
    doc { "Returns `true` if the array is empty." }
    returns("Boolean")
    body {
        "return size == 0"
    }
}
그것은 보기에 약간 스케줄 키 같지만, f의 정의를 보면
fun f(signature: String, init: GenericFunction.() -> Unit) = GenericFunction(signature).apply(init)
, 블록의 수신기는 GenericFunction, 이 종류는 방법의 생성기입니다.
템플릿에서 코드를 생성하려면 다음 명령을 수행합니다.
$ cd libraries/tools/kotlin-stdlib-gen
$ mvn compile exec:java
현재libraries/stdlib/src/generated/Arrays.kt 생성isEmpty.

확장 함수를 stdlib 집합에 추가


실제로 peek 디버깅을 위해 목록의 내용을 엿보는 방법을 추가해 보았다.
listOf(1, 2, 3)
        .map { ... }
        .peek { println(it) } //=> 1, 2, 3
        .map { ... }
생성기 방법의 일부분을 소개하다.
name
what
inline
생성 방법이 내연인지 여부를 지정합니다
typeParam
유형 매개변수 지정하기
only
확장 함수를 정의할 컬렉션 지정(Family)
returns
반환 값 유형 지정
body
방법의 내용은 여기에 적혀 있습니다.
잡목peek의 실현은 다음과 같다.
templates add f("peek(action: (T) -> Unit)") {
    inline(true)
    only(Lists)
    typeParam("T")
    returns("List<T>")
    body {
        """
            for (item in this)
                action.invoke(item)
            return this
        """
    }
}
템플릿의 정의는 자기법이고 취미가 있기 때문에 먼저 generated 실현하고 싶은 방법을 쓰고 이동한 후에 템플릿으로 옮기는 것이 좋다.
쓴 후에 구축하고 실행해 보세요.
$ mvn compile exec:java
$ ant runtime
$ dist/kotlinc/bin/kotlinc
Type :help for help, :quit for quit
>>> listOf(1,2,3).peek { println(it) }
1
2
3
[1, 2, 3]

가족 정보

Family 어떤 종류를 생성하는지에 대응한다.templatesonly에서 지정Family.기본값은 다음과 같이 모든 Family에서 생성됩니다.
Family
packageName
SourceFile
Iterables
"kotlin.collections"
Collections
Collections
"kotlin.collections"
Collections
Lists
"kotlin.collections"
Collections
Sets
"kotlin.collections"
Sets
Maps
"kotlin.collections"
Maps
InvariantArraysOfObjects
"kotlin.collections"
Arrays
ArraysOfObjects
"kotlin.collections"
Arrays
ArraysOfPrimitives
"kotlin.collections"
Arrays
Sequences
"kotlin.sequences"
Sequences
CharSequences
"kotlin.text"
Strings
Strings
"kotlin.text"
Strings
Ranges
"kotlin.ranges"
Ranges
RangesOfPrimitives
"kotlin.ranges"
Ranges
ProgressionsOfPrimitives
"kotlin.ranges"
Ranges
Generic
""
Misc
Primitives
""
Miscpeek의 예에서 only 에서 Lists 를 지정했기 때문에 libraries/stdlib/src/generated/_Collections.kt 에서 방법이 생성된 것 같다.

좋은 웹페이지 즐겨찾기