Kotlin'de değişken adı veya Yayılma Operatörü öncesinde Kotlin yıldız işareti operatörü


108

Kotlin'de bir değişken adından önce bir yıldız işaretinin tam olarak ne yaptığını bilmek istiyorum. Bunu ( *args) bir Spring boot Kotlin örneğinde gördüm :

@SpringBootApplication
open class Application {

    @Bean
    open fun init(repository: CustomerRepository) = CommandLineRunner {
        repository.save(Customer("Jack", "Bauer"))
        repository.save(Customer("Chloe", "O'Brian"))
        repository.save(Customer("Kim", "Bauer"))
        repository.save(Customer("David", "Palmer"))
        repository.save(Customer("Michelle", "Dessler"))
    }
}

fun main(args: Array<String>) {
    SpringApplication.run(Application::class.java, *args)
}

Yanıtlar:


176

*Operatör olarak bilinir Yayılması Operatörü KOTLIN içinde.

Gönderen Kotlin Referans ...

Bir vararg-işlevini çağırdığımızda, bağımsız değişkenleri tek tek iletebiliriz, örneğin asList (1, 2, 3) veya zaten bir dizimiz varsa ve içeriğini işleve geçirmek istiyorsak, yayılmayı kullanırız operatör (dizinin önüne * koyun):

Bir Diziye, onu kabul eden bir işleve geçirmeden önce uygulanabilir varargs.

Örneğin...

Çeşitli sayıda argüman kabul eden bir fonksiyonunuz varsa ...

fun sumOfNumbers(vararg numbers: Int): Int {
    return numbers.sum()
}

Bir dizinin öğelerini bağımsız değişkenler olarak iletmek için yayılma operatörünü kullanın:

val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'

Notlar:

  • *Operatör ayrıca çarpma operatörü (tabii ki).
  • Operatör yalnızca bir işleve argümanlar iletilirken kullanılabilir. İşlemin sonucu hiçbir değer vermediği için saklanamaz ( tamamen sözdizimsel şekerdir).
  • Operatör ilk başta bazı C / C ++ programcılarının kafasını karıştırabilir çünkü bir göstericinin referansı kaldırılıyor gibi görünüyor. Değil; Kotlin'in işaretçi kavramı yok .
  • Operatör, bir vararg işlevi çağrılırken diğer argümanlar arasında kullanılabilir . Bu örnekte gösterildiği burada .
  • Operatör, applyçeşitli işlevsel programlama dillerindeki işleve benzer .

1
Yayma operatörü satır içi dizisi mi? Örneğin a = [1, 2, 3] funWithVarg (* a) dizisi için funWithVarg (1,2,3)? Bayt kodu seviyesinde demek istiyorum.
— David

24

Doğrudan "bu şey nedir!?!" Sorusuna verilen yanıtlara ek olarak, genellikle a'ya sahip olduğunuz Listve onu a bekleyen bir işleve geçirmek istediğiniz bir durumunuz olur vararg. Bunun için dönüşüm şudur:

someFunc(x, y, *myList.toTypedArray())

Bu son parametre varsayarak someFuncbir vararglistede elemanlar aynı tipte.


Çok teşekkür ederim! Bu, yayma operatörünüz çalışmadığında dikkat etmeniz gereken bir şey olarak yayılma operatörü bölümünün altındaki resmi belgelerde olmalıdır.
— masa

Teşekkürler! Gerçekten yardımcı oldu. Perde arkasında "Yayılma Operatörü" nedir merak ediyorsunuz? Varargs değeri elde etmenin bir yolu mu?
— Nicolas Jafelle

11

Dokümantasyonda açıklandığı gibi , bu bir spread operatörüdür:

Bir vararg-işlevini çağırdığımızda, bağımsız değişkenleri tek tek iletebiliriz, örneğin asList (1, 2, 3) veya zaten bir dizimiz varsa ve içeriğini işleve geçirmek istiyorsak, yayılmayı kullanırız operatör (dizinin önüne * koyun):

val a = arrayOf(1, 2, 3) 
val list = asList(-1, 0, *a, 4)

6

Java'da bir diziyi olduğu gibi geçirebilirsiniz ancak yayılma operatörüyle bir diziyi açmanın bir avantajı, yayma operatörünün *bir dizideki değerleri ve bazı sabit değerleri tek bir çağrıda birleştirmenize izin vermesidir. Java bunu desteklemiyor.


1
Olumlu oy verildi, çünkü neden böyle uyguladıklarını kendime sordum. Hala% 100 emin değilim. Demek istediğim, çoğu durumda bunu çıkaramazlar mı?
— Tim Büthe

1
@ TimBüthe Bazı durumlarda, bunun çıkarılması mümkün olmayabilir, aşağıdaki durumları göz önünde bulundurun val resultOne = arrayOf(intArrayOne, intArrayTwo)ve val resultTwo = arrayOf(*intArrayOne, *intArrayTwo). Türleri resultOneve resultTwosırasıyla Array<Int>ve Array<Array<Int>>. Sanırım sebeplerden biri bu
— Farid

6

Bir vararg (Değişken argüman sayısı) parametresini kabul eden bir işlev, örneğin:

fun sum(vararg data:Int)
{
   // function body here         
}

Şimdi bu yöntemi çağırmak için şunları yapabiliriz:

sum(1,2,3,4,5)

Ama ya bu değer bir dizide varsa, örneğin:

val array= intArrayOf(1,2,3,4,5)

daha sonra, bu yöntemi çağırmak için yayılma operatörünü kullanmamız gerekir, örneğin:

 sum(*array)

Burada, * (yayılma operatörü) bu dizinin tüm içeriğini aktaracaktır.

* dizi 1,2,3,4,5'e eşdeğerdir

Ama bir dakika bekleyin, ya böyle sum(array) dersek: bize Type Mismatch derleme zamanı hatası verecektir:

Type mismatch.
Required:Int
Found:IntArray

Sorun, sumfonksiyonun bir vararg Intparametreyi kabul etmesidir (1,2,3,4,5 gibi bir değer kabul eder) ve diziyi geçersek, olarak geçecektir IntArray.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.