科特林具有非常不错的迭代功能,如forEach
或repeat
,但我不能让break
和continue
运营商与他们(包括本地和非本地)的工作:
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
Run Code Online (Sandbox Code Playgroud)
目标是模拟通常的循环,其功能语法尽可能接近.在某些旧版本的Kotlin中肯定是可能的,但我很难重现语法.
问题可能是标签的错误(M12),但我认为第一个例子应该可行.
在我看来,我已经阅读过关于特殊技巧/注释的某处,但我找不到关于这个主题的任何参考.可能如下所示:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
Run Code Online (Sandbox Code Playgroud) 在Kotlin中,如果要使用该元素forEach
,可以使用it
关键字.所以现在我想知道如果我有这样的forEach
内部我应该怎么做forEach
:
list.forEach {
val parent = it
it.forEach {
// `it` now become the element of the parent.
}
}
Run Code Online (Sandbox Code Playgroud)
我认为只为命名约定定义一个新变量是如此愚蠢.有这个问题的任何其他解决方案?
我已经在Kotlin中编写了这些方法并分析了字节码:
class A {
object b {
fun doSomething() {}
}
}
Run Code Online (Sandbox Code Playgroud)
class A {
companion object b {
fun doSomething() {}
}
}
Run Code Online (Sandbox Code Playgroud)
fun doSomething() {}
Run Code Online (Sandbox Code Playgroud)
字节码结果
Test$asb
,public final doSomething()I
Test$Companion
,public final doSomething()I
TestKt
,public final static doSomething()I
我的问题是:
我有一个枚举类,我想在给定枚举变量的情况下返回一个枚举实例,例如findById (enum(id, color))
.我该怎么办?伴侣对象?宾语?
似乎有一个真正的静态方法的唯一方法是在包级别,没有类声明.但这有点过于全球化.有没有办法通过以下方式访问它:ClassName.staticMethod
,staticMethod是非常静态的.
提供有意义的包声明方法,伴随对象和对象的示例.
语境.我一直在Kotlin编码,我发现它很棒.但有时我需要做出决定:例如,一个沉重的不可变属性在java中我会声明为静态final,但在Kotlin中我发现很难"找到一个等价物".
如何在Kotlin中部分委托方法/字段?
具体来说:这里我试图User
从接口继承类TraitA
并marked: Boolean
在包装器中实现字段StateA
.这将清理User
实现,因为marked
它只是一个状态字段.注意,TraitA
不能是一个类,因为我想使用几个这样的接口:User() : TraitA by StateA, TraitB by StateB, ..
/* does not compile (Kotlin M12) */
interface TraitA {
var marked: Boolean
fun doStaffWithMarked() // must be overridable
}
class StateA() : TraitA {
override var marked = false
}
class User() : TraitA by StateA(){
override fum doStaffWithMarked() {
//...all fancy logic here...
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是在一个地方实现所有:
class User() : TraitA{
override var …
Run Code Online (Sandbox Code Playgroud) 在Kotlin中,当一个类有多个构造函数时,我们如何在另一个构造函数中调用指定的(来自iOS世界,我找不到更好的名称)构造函数.
让我举个例子
final class LoadingButton: LinearLayout {
var text:String? = null
constructor(context: Context, text: String) : this(context) {
this.text = text
}
constructor(context: Context) : super(context) {
val t = this.text
this.view {
button(t) { /* ... */}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里,如果我这样做loadingButton("TEST", {})
,那个字符串不会传播到按钮,因为this(context)
在方便构造函数中的代码之前调用(再次抱歉:).
可以在Kotlin解决吗?就像是
constructor(context: Context, text: String) {
this.text = text
this(context)
}
Run Code Online (Sandbox Code Playgroud)
编辑
只是为了澄清这个想法,因为它被问到,想法是在一个活动中写这样的东西:
onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
verticalLayout {
loadingButton("Some text")
//or
loadingButton() { this.text = "Some text"}
} …
Run Code Online (Sandbox Code Playgroud) 我的项目中有两个实用程序库。我正在寻找为库编写 CMake 配置的最佳方法。
/my_project
--> CMakeLists.txt
--> main.cpp
--> /utils
--> CMakeLists.txt
--> common.h
--> /base_c
--> CMakeLists.txt
--> base_c.c
--> base_c.h
--> /base_cpp
--> CMakeLists.txt
--> base_cpp.cpp
--> base_cpp.hpp
Run Code Online (Sandbox Code Playgroud)
我当前的 CMake 文件:
/my_project/CMakeLists.txt
cmake_minimum_requared(VERSION 3.8)
project(my_project)
add_subdirectory(utils)
add_executable(main main.c)
target_link_libraries(main utils base_c base_cpp)
Run Code Online (Sandbox Code Playgroud)
/my_project/utils/CMakeLists.txt
add_subdirectory(base_c)
add_subdirectory(base_cpp)
add_library(utils)
target_sources(utils PUBLIC common.h)
Run Code Online (Sandbox Code Playgroud)
/my_project/utils/base_c/CMakeLists.txt
add_library(base_c base_c.c)
target_sources(base_c PUBLIC base_c.h)
Run Code Online (Sandbox Code Playgroud)
/my_project/utils/base_cpp/CMakeLists.txt
add_library(base_cpp base_cpp.cpp)
target_sources(base_cpp PUBLIC base_cpp.hpp)
find_library(BASEC base_c ../base_c)
target_link_libraries(base_cpp BASEC)
Run Code Online (Sandbox Code Playgroud)
问题是base_cpp
没有找到包含来自base_c
. 我应该如何修复配置?
我设法让它与 一起工作target_include_directories(base_cpp PRIVATE ../base_c)
,但根据 …
我试图编写一些通用代码,但无法摆脱Type of 'PROPERTY' is not a subtype of the overridden property
错误.
我的代码的简化版本:
abstract class BaseP<V> {
var view: V? = null
}
abstract class BaseF {
fun smth() {
pp.view = this
}
abstract val pp: BaseP<BaseF>
}
abstract class SubF: BaseF() {
abstract override val pp: BaseP<SubF>
// Error:(20, 30) Type of 'pp' is not a subtype of the overridden property 'public abstract val pp: BaseP<BaseF> defined in BaseF'
}
Run Code Online (Sandbox Code Playgroud)
我发现错误可以 - @Suppress
但我怀疑它是最好的也是唯一的方法.还有更好的东西吗?
毕竟我无法理解,为什么subtypeA<subtypeB>
不算作子类型 …
我有这些数据类:
data class RouteType(
@SerializedName("type")
val type: String,
@SerializedName("items")
val items: List<RouteItem>)
data class RouteItem(
@SerializedName("id")
val id: String,
@SerializedName("route")
private val route: List<DoubleArray>)
Run Code Online (Sandbox Code Playgroud)
我想按类型过滤RouteType列表,并按ID过滤RouteItem列表.
我的代码现在:
// val filter: HashMap<String, List<String>>
val result = routeTypes // List<RouteType>
.filter { it.type in filter.keys }
.map {
routeType -> routeType.items.filter { it.id in filter[routeType.type]!! }
}
Run Code Online (Sandbox Code Playgroud)
如何.map
使用过滤列表制作返回列表?或许还有另一种方式?
谢谢,但flatmap
不完全是我需要的,我想.flatmap
返回嵌套列表(List<RouteItem>
),但我想要List<RouteType>
.
我通过这段代码得到了它:
val result = routeTypes
.filter { it.type in filter.keys }
.map { …
Run Code Online (Sandbox Code Playgroud) 我需要将https://jcenter.bintray.com/添加到IntelliJ IDEA中.IJ应该能够像在Maven Central中那样从JCenter中查找和更新软件包.
目前,当我将URL添加到maven repos列表时,它会抱怨"找不到存储库".
注意:我使用内部IJ构建系统,那里没有Maven或Gradle(我有理由不使用它们)
我正在尝试在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区别对待吗?