我正在尝试在Kotlin中创建一个非常简单的通用NDArray类,该类将lambda表达式用作初始化函数。
class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
val values: Array<T> = Array(i * j, f)
}
Run Code Online (Sandbox Code Playgroud)
典型的用法是:
fun main(args: Array<String>){
val m = NDArray(4, 4, ::zero)
}
fun zero(i: Int) = 0.0
Run Code Online (Sandbox Code Playgroud)
我的问题是Kotlin编译器抱怨构造函数中的值初始化
values = Array(i * j, f)
Run Code Online (Sandbox Code Playgroud)
通过说“不能使用'T'作为化类型参数。改为使用类”。为什么呢
编辑:
如果我改为用自己的MyArray代替Kotlin Array实现,则会编译:
class NDArray<T>(i: Int, j: Int, f: (Int) -> T) {
val values: MyArray<T> = MyArray(i * j, f)
}
class MyArray<T>(i:Int, init: (Int) -> T) {
...
}
Run Code Online (Sandbox Code Playgroud)
不确定当Kotlin具有相同的构造函数时,为什么Kotlin将MyArray与常规Array区别对待吗?
fun test(temp: Int) {
temp = 5
}
Run Code Online (Sandbox Code Playgroud)
编译器抛出一个错误,说"不能重新分配val".
局部变量是否仅在Kotlin中读取?
在Kotlin stdlib中是否有标准操作可以迭代3个(或更多)列表的压缩?
实际上应该做到:
list1.zip(list2).zip(list3) { (a, b), c -> listOf(a, b, c)}
Run Code Online (Sandbox Code Playgroud) 我正在使用Kotlin的html库kotlinx.html进行动态html构建.
对于调试建议我想写一个标签作为原始html.但我找不到任何方法可以做到这一点.简单的文本添加替换字符,如<代码,所以它没有帮助:
StringBuilder().appendHTML().html {
body {
+"""
<form action="http://courier-voddan.rhcloud.com/customer/new_task" method="get">
get=form
id=3333
<button type="submit">ok</button>
</form>
""".trimIndent()
}
}
Run Code Online (Sandbox Code Playgroud) 我已经开始学习在android中使用kotlin语言并在初始化我的按钮变量时遇到问题,因为在定义我的变量时,它要求在使用null值初始化时给出一些初始值并在oncreate函数中绑定变量
kotlin.KotlinNullPointerException
这是我的代码
class AddsFragment : Fragment() {
var Add: Button = null!!
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val Rootview = inflater!!.inflate(R.layout.clubsfragment, null, false)
Add = Rootview.findViewById(R.id.add) as Button
return Rootview
}
}
Run Code Online (Sandbox Code Playgroud) android nullpointerexception kotlin kotlin-android-extensions
我正在努力学习Kotlin,我在使用函数时遇到了一个问题.
fun main(args: Array<String>) {
println(max(20, 10))
}
fun max(a: Int, b: Int) = if (a > b) a else b
Run Code Online (Sandbox Code Playgroud)
这里我有一个函数MAX.现在上面的实现和函数MAX的下面的实现有什么区别,虽然两者都给出相同的输出.
fun max(a: Int, b: Int): Int?{
if(a > b)
return a
else
return b
}
Run Code Online (Sandbox Code Playgroud) 我是Kotlin的新手,但我非常喜欢它.当你可以将三行代码合二为一时,会有一种美妙的感觉.现在我经常发现自己正在查看我的代码并思考"这里有一些冗余.应该有一种更简洁的方法来实现它." 当我做一些搜索时,Kotlin经常提供更简洁的方式.
这是一个问题,我感觉应该有一个简单,简洁的Kotlin解决方案,但我不知道它.希望你能开导我!
像这个人为的例子一样代码:
fun doSomething(): Boolean {
if (randomInt % 2 == 0) {
foo = Foo()
true
} else {
bar = null
false
}
}
Run Code Online (Sandbox Code Playgroud)
根据if条件,我想运行一些代码,然后返回条件的值.令我烦恼的是,我必须明确说"如果条件成立,则返回true.如果是假,则返回false." 这似乎是多余的.当然,我可以说return randomInt % 2,但我想根据它是否真实运行代码.
是否有一个我不知道的魔术师Kotlin?我是否应该为我处理这种情况,尽管调用的语法与if语句不同?是否有某种映射功能,或某种方式重载如果?似乎应该有一个简洁,聪明的答案,但它不会来找我.