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.