2017-12-06 29 views
1

an earlier question에서받은 조언에 따라 "별칭"으로 자주 사용하는 일부 외국어 기능의 이름을 단축했습니다. 이것은 확장 기능을 위해 잘 작동했다; 그러나 별칭을 사용하려는 몇 가지 최상위 기능이 있습니다. 단순화 된 예를 들어, generateSequence 기능을 고려하십시오.제네릭을 포함하는 Kotlin 함수의 인라인 별칭?

// DOES NOT COMPILE 
inline val <T:Any> seq:(()->T?)->Sequence<T> get() = ::generateSequence 

을 ...하지만 잘 in this answer 설명 된 바와 같이 나는 일반은, 수신기 타입에 사용되어야 할 수 없기 때문에 : 나는이 작업을 수행 할 수 있어야합니다. 인라인을 유지하는 최상위 함수 (제네릭 필요)에 대한 별칭을 만드는 다른 방법이 있습니까?

편집 : 나는이 질문을 게시 한 후 Any? 스타 프로젝션 권리를 사용하여 시도,하지만 난 여전히 좋은 답변이라고 생각하지 않습니다 : 그것은 유형 검사를 저해 할 수 있으므로

inline val seq:(()->Any?)->Sequence<*> get() = ::generateSequence 

이 boptimalsu 보인다 시퀀스의 요소 유형에 올바른? 다른 답변/생각할 수있는 것에 관해서는?

답변

2
당신이 하나의 소스 파일로 제한됩니다 불구하고 이름 바꾸기 가져 오기이며, 사용할 수있는 옵션

: 생각, 당신이 할 수있는 최선은 선언에 다시 가을에 그 외에도

import kotlin.sequences.generateSequence as seq 

fun main(args: Array<String>) { 
    seq(1) { it + 1 }.take(10).forEach(::println) 
} 

입니다 또 다른 인라인 함수 :

inline fun <T> seq(nextFunction:() -> T?) = 
    generateSequence(nextFunction) 

사실, 나는 여전히 함수 참조를 반환 인라인 속성을 사용하기 때문에이 옵션의 성능, 기능 참조하여 하나의보다 더 나은 것으로 기대할 수는 약간 오버 헤드가 때를 해당 참조로 전화를 걸고이 cal l은 인라인되어 있으므로 다른 중첩 호출에 오버 헤드가 발생하지 않아야합니다.

+0

나는 당신의 인라인 함수 접근 방식을 좋아하지만''inline-parameter' 오류의''잘못된 사용법 '을 반환한다고 생각합니다. 나는 인라인 속성을 사용했는데, [이 질문을 일찍] (https://stackoverflow.com/questions/47605151) 질문을 한 후에도 인라인으로 다른 방법을 찾을 수 없었기 때문입니다. 인라인 속성 (함수 참조)이'noinline' 람다 매개 변수가있는 함수보다 성능이 좋지 않다고 생각하십니까? (내가 할 수있는 함수, 즉 제네릭을 필요로하지 않는 함수에 대해 말하고 있다고 가정 할 때)? – sirksel