只计算一次属性

给出以下代码 class A class B { val property: A get() = A() } fun main(args: Array) { val b = B() println(b.property) println(b.property) } 它每次返回一个新的A实例B.property 。 是否有简单的方法让它每次都返回相同的实例?

为什么加号需要在行尾,而不是在下一行的开头?

在Kotlin中,如果您想要添加expression式来跨越多行,则需要将加号放在行尾,而不是开头。 例如: var a = 1 var b = 2 var c = 3 var d = a + b + c println(d) // prints “6” var e = a + b + c println(e) // prints “1” 据我所知,这是因为Kotlin把第二个例子解释为三个单独的陈述,就像这样: var e = a + b + c 但我还没有find任何文件说明为什么+ somevariable某些变化本身是一个有效的陈述。 它不增加variables,而println(+somevariable)打印与println(somevariable)相同的值。

在Kotlin的generics中扩展类

我试图用简单的构造函数来实现这个枚举,如下所示: enum class WithGraphicKind(val innerClass: Class) { CONTACT(Contact::class.java), SALE(Sale::class.java); } 由于Contact和Sale类都实现了一个公共接口WithGraphics ,所以我想输入构造函数为innerClass: Class ,但是这不起作用。 我也试过Class和其他类似的东西,但没有任何作用。 我在这里的官方文档中也找不到任何提示: https : //kotlinlang.org/docs/reference/generics.html

Kotlin,实例化问题和generics

我有一个类Vec3i延伸Vec3t data class Vec3i( override var x: Int = 0, override var y: Int = 0, override var z: Int = 0 ) : Vec3t(x, y, z) 作为一个次要的构造如下 constructor(v: Vec3t) : this(vxtoInt(), vytoInt(), vztoInt()) 和另一个Vec3ub类,Vec3t总是延伸 data class Vec3ub( override var x: Ubyte = Ubyte(0), override var y: Ubyte = Ubyte(0), override var z: Ubyte = […]

Kotlin JS – 字符串到数字的转换?

如何做Kotlin JS应用程序中的字符串到数字转换。 我使用下面的代码,并有一些麻烦,从HTMLInputElement值转换为双。 fun c2f(self: Any) { console.log(“Self object: ${self} “) val celsius = document.getElementById(“celcius”)?.getAttribute(“value”) as Double val fahrenheit = celsius * 1.8 + 32 console.log(“Fahrenheit value: ${fahrenheit} “) window.alert(“Celcius (${celsius}) -> Fahrenheit (${fahrenheit}) “) } 此外,我没有看到任何toDouble()函数的String类的情况下,在JVM应用程序的情况。

Kotlin:为什么我不能使用我的一个function?

我想使用我定义的函数接受一个字符串,但软件不会编译。 fun passes(address: String) = Collections.frequency(addresses, address) <= CONNECTIONS_PER_IP fun passes(remoteAddress: InetSocketAddress) = passes(remoteAddress.hostName) 我甚至无法使用自定义字符串调用字符串函数,例如, passes(“127.0.0.1”) 。 None of the following functions can eb called with the arguments supplied. passes(String) defined in abendigo.Firewall passes(InetSocketAddress) defined in abendigo.Firewall

Kotlin的crossinline和noinline有什么不同?

此代码编译时会有一个警告 (对性能影响不明显 ): inline fun test(noinline f: () -> Unit) { thread(block = f) } 此代码不能编译 ( 非法使用内联参数 ): inline fun test(crossinline f: () -> Unit) { thread(block = f) } 此代码编译时会有一个警告 (对性能影响不明显 ): inline fun test(noinline f: () -> Unit) { thread { f() } } 此代码编译没有警告或错误 : inline fun test(crossinline f: () -> […]

如何执行val的多步骤初始化

为了学习一点kotlin我建立了一个基于经典论文Monadic Parser Combinators的解析器组合库。 在我的情况下,我需要转发declare解析器,因为递归语法。 准备最终expression式解析器时,我需要更新前向声明 我第一次尝试是这样的 val addLike = mulLike separatedBy addLikeSeparator val expression = forwarded.second(addLike) addLike 这个想法是执行一个短的初始化,然后返回addLike来初始化值。 这是一个非常常见的模式,当我做一些F#编程,我认为这是一个很好的模式,因为它简化了隐藏初始化细节。 然而,这在kotlin中kotlin : Error:(195, 5) Kotlin: Expecting a top level declaration 这种方法也失败了: val addLike = mulLike separatedBy addLikeSeparator val expression = forwarded.second(addLike); addLike 问题似乎是这样的; 将两个expressions组合成一个statement 。 所以我试了一下,希望它的行为有点像C / C ++,但没有运气: val addLike = mulLike separatedBy addLikeSeparator val […]

在Kotlin没有吸气的财产

我怎样才能用一个自定义的setter声明一个属性,但是在Kotlin没有getter? 例如在安科 ,他们这样做: var myProperty: Type @Deprecated(AnkoInternals.NO_GETTER, level = DeprecationLevel.ERROR) get() = AnkoInternals.noGetter() set(value) { field = value; /* setter logic */ } 但是对我来说这看起来有些不好意思。 这是一个正确的方法吗? 如果是,那么项目没有Anko依赖的情况呢? PS让我清楚 – 我想要的不是吸气,而是私人的吸气

函数返回Kotlin中的临时对象

目前我有一个私人的function,返回一个Pair对象。 第一个用户是东西的发送者,第二个用户是这个东西的接收者。 我认为这Pair是不够的自我解释 – 或者如果你喜欢干净,即使它只是一个私人function。 是否有可能返回一个像这样的临时对象: private fun findUsers(instanceWrapper: ExceptionInstanceWrapper): Any { return object { val sender = userCrud.findOne(instanceWrapper.fromWho) val receiver = userCrud.findOne(instanceWrapper.toWho) } } 并像这样使用返回的值: // … val users = findUsers(instanceWrapper) users.sender // … users.receiver // … // … ? 如果不是,Kotlin的特别对象有什么意义?