2016-05-07 5 views
6

मैं एक निम्न कोड है: के बाद से data संपत्ति परिवर्तनशील है हम कर सकते हैंसंपत्ति प्रतिनिधिमंडल परिवर्तनशील नक्शे से पके हुए

val mapped = Mapped(mapOf("firstName" to "initialFirstName")) 
println(mapped.firstName); // prints "initialFirstName" 

हालांकि:

class Mapped(var data:Map<String,String>){ 
    val firstName:String by data 
} 

इस मामले में ठीक Mapped इस प्रकार प्रयोग किया जाता है काम करता है इसका मूल्य बदलें यानी:

mapped.data = mapOf("firstName" to "updated"); 

हालांकि firstName संपत्ति अभी भी "initialFirstName" रखती है।

क्या इस, known/documented पर अप्रत्याशित (मेरे लिए) व्यवहार के बावजूद एक काम है?

उत्तर

6

मुद्दों KT-5870 तक, KT-9772 हल कर रहे हैं तो आप निम्न कर सकते हैं:

operator fun <V, V1 : V> (() -> Map<in String, V>).getValue(thisRef: Any?, property: KProperty<*>): V1 { 
    val map = this() 
    return map[property.name] as V1 
} 

कौन सा तो के रूप में इस्तेमाल किया जा सकता है:

class Mapped(var data:Map<String,String>){ 
    val firstName:String by { data } 
} 

ऊपर अच्छी तरह से nullability संभाल नहीं करता है। यहां एक बेहतर संस्करण है:

operator fun <V, V1 : V> (() -> Map<in String, V>).getValue(thisRef: Any?, property: KProperty<*>): V1 { 
    val map = this() 
    val key = property.name 
    @Suppress("UNCHECKED_CAST") 
    val value = map[key] as V1 
    if (property.returnType.isMarkedNullable) { 
     return value 
    } else { 
     if(value != null){ 
      return value 
     } 
     if(map.containsKey(key)){ 
      throw KotlinNullPointerException("Property baking map returned null value for key '$key' for non nullable property: $property") 
     } else { 
      throw KotlinNullPointerException("Property baking map has no key '$key' for non nullable property $property") 
     } 
    } 
} 
संबंधित मुद्दे