小编Sal*_*RYS的帖子

Kotlin的crossinline和noinline有什么区别?

  1. 此代码编译时出现警告(对性能影响不显着):

    inline fun test(noinline f: () -> Unit) {
        thread(block = f)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 此代码无法编译(非法使用inline-parameter):

    inline fun test(crossinline f: () -> Unit) {
        thread(block = f)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 此代码编译时出现警告(对性能影响不显着):

    inline fun test(noinline f: () -> Unit) {
        thread { f() }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 此代码编译时没有警告或错误:

    inline fun test(crossinline f: () -> Unit) {
        thread { f() }
    }
    
    Run Code Online (Sandbox Code Playgroud)

这是我的问题:

  • 怎么会(2)不编译,但(4)呢?
  • noinline和之间究竟有什么区别crossinline
  • 如果(3)没有产生没有性能改进,为什么(4)会这样做?

kotlin

55
推荐指数
3
解决办法
7895
查看次数

CSS flexbox动态调整大小:更喜欢max-width

我有一个包装的行flexbox容器.
在其中的项目,我设置:

  • flex: 1; 因此,物品会逐渐填满容器
  • min-width: X; max-width: Y;' 所以物品保持在可接受的大小.

这是一个简单的codepen示例.

问题(在示例中可见)是resize-wrap的行为.

会发生什么:
每个项目都尽可能小,所以它们的最大数量放在第一行,然后它们的增长就像填充线一样多.因此,物品max-width几乎从未到达,物品更接近min-width.

我正在寻找的东西:
每个项目都尽可能大,所以它们的最小数量放在第一行,然后缩小,就像添加一个新项目并填充该行一样.因此,物品min-width几乎从未到达,物品更接近max-width.

换句话说:
我想要每行最少可能的项目数,而不是最大数量.

有没有办法在没有JS的CSS中做到这一点?

谢谢 !

css3 flexbox

21
推荐指数
1
解决办法
3万
查看次数

RecyclerView:Animate项目调整大小

我有一个RecyclerView.回收者视图的每个项目都可以扩展或不扩展.只能同时扩展一个项目.

本质上,我正在尝试在lolipop dialier中重新创建历史列表.

我发现在RecyclerView上使用LayoutTransition 使它崩溃.

但我无法正确设置两个状态之间项目视图更改的动画.

我曾尝试getItemAnimator().setSupportsChangeAnimations(true)过,notifyItemChanged(getPosition())但有两个问题:

  • 视图被重新创建,使得过渡非常奇怪,因为它在项目移动的同时在下一个项目上方淡入.出现的新视图不是调整大小,它已经是完整大小.
  • 当视图重新创建时,旧视图淡出而新视图淡入,这使视图背景颜色闪烁.

我还尝试LayoutTransition在动画的持续时间内设置项目视图,但这种方法的问题是RecycleView的布局立即更新而不跟随动画.

我为这两个尝试创建了一个关于这个问题的小型演示项目. 项目来源在这里.

如何在项目布局更改中创建平滑过渡?

android layouttransition android-recyclerview

19
推荐指数
1
解决办法
1万
查看次数

SwiftUI:struct View 与 @ViewBuilder

如果我想在 SwiftUI 中渲染项目列表,我可以这样做(使用 XCode 12):

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(texts.indices, id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    }

    struct MyRow: View {
        let label: String
        var body: some View {
            Text(label).font(.title3).padding()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以是一个函数,而不是MyRow一个结构体,这使得代码更加简洁和实用:

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(texts.indices, id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    } …
Run Code Online (Sandbox Code Playgroud)

swiftui

13
推荐指数
1
解决办法
2705
查看次数

Java 8:重复的方法名称和签名lambda

我正在玩Java 8 lambdas,方法引用和接口默认方法来探索currying的精彩世界,然后我得到了这个Java错误我无法理解.

这是代码:

public class Main {

    public interface CurryBiConsumer<T, U> extends BiConsumer<T, U> {
        default public CurryConsumer<U> curryFirst(T t) {
            return (u) -> accept(t, u);
        }
        default public CurryConsumer<T> currySecond(U u) {
            return (t) -> accept(t, u);
        }
    }

    public interface CurryConsumer<T> extends Consumer<T> {
        default public Runnable curry(T t) {
            return () -> accept(t);
        }
    }

    static void execute(Runnable r) {
        System.out.println("BEFORE");
        r.run();
        System.out.println("AFTER");
    }

    static void display(String str, int count) {
        System.out.println("DISP: " + str + …
Run Code Online (Sandbox Code Playgroud)

java java-8

10
推荐指数
1
解决办法
4686
查看次数

Android _Unwind_Backtrace里面的sigaction

我试图在我的Android NDK应用程序中捕获SIGSEGV等信号以进行调试.为此,我设置了一个名为的sigaction.

我现在正试图获得通话的堆栈.问题是_Unwind_Backtrace只能在当前堆栈和sigaction上运行它自己的堆栈.

那么,有没有办法获得接收信号的执行指针的堆栈?(基本上告诉_Unwind_Backtrace放松另一个堆栈而不是当前?)

我应该指出:

  • 使用backtrace()backtrace_symbols()不是选项,因为这些功能未在Android NDK中提供

  • 我正在使用GDB来调查本地设备上的崩溃.我不想替换GDB,我希望能够在向他发送测试版本时从客户端接收有意义的堆栈跟踪.

编辑:使用Android的libcorkscrew从系统/核心所建议的法登,但是当我使用它的unwind_backtrace_signal_arch功能,我得到一个奇怪的回溯不代表死机我都试过了.

android signals stack-trace backtrace android-ndk

7
推荐指数
1
解决办法
3890
查看次数

Kotlin KDoc:文档?

这里看到,这里那里引用了KDoc,它是Kotlin的JavaDoc实用程序.

但是,我找不到任何关于如何使用它的文档,更不用说如何自定义它或将它集成到Maven或Gradle中.

我知道Kotlin API文档是使用KDoc生成的,因为页面源具有以下HTML注释:<!-- Generated by kdoc on Sun Jul 06 20:27:33 UTC 2014 -->

那么,有没有关于如何使用KDoc的文档?

kotlin kdoc kotlin-dokka

7
推荐指数
1
解决办法
4113
查看次数

仅为mysql jdbc设置自定义SSL信任库

我希望能够通过SSL连接与JDBC连接到MySQL服务器.在MySQL文档指出,我们应该设置系统属性:

java System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file"); System.setProperty("javax.net.ssl.trustStorePassword","password");

实际上,它适用于MySQL.但是,一旦我设置了这些系统属性,我就无法对注册的网站进行常规的HTTPS调用.系统信任已被覆盖,我得到了SSLHandshakeException.

我希望能够仅为JDBC MySQL连接设置信任.任何常规HTTPS调用都应使用系统信任库.
怎么做到呢 ?

我发现这个问题可能导致答案,但看起来它不起作用.

java mysql ssl jdbc

5
推荐指数
1
解决办法
1628
查看次数

使用 gradle 脚本 kotlin 配置 uploadArchives 任务

我想将我的库切换到 Gradle Script Kotlin,但我找不到配置 uploadArchive 任​​务的方法。

这是我想要翻译的 groovy kotlin 脚本:

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
                    authentication(userName: ossrhUsername, password: ossrhPassword)
            }

            snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") {
                authentication(userName: ossrhUsername, password: ossrhPassword)
            }

            pom.project {
                /* A lot of stuff... */
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我明白它应该从

task<Upload>("uploadArchives") {
    /* ??? */
}
Run Code Online (Sandbox Code Playgroud)

... 差不多就这样了!

AFAIU,在 Groovy 中,该Upload任务由MavenPlugin. 它在 Kotlin 中如何工作?

gradle-kotlin-dsl

5
推荐指数
1
解决办法
1999
查看次数

Kotlin的反思:未知的类型参数

我正在对Kotlin的反思进行一些实验.

我试图通过其参数获得泛型类的反射对象.

在Java中,那将是一个ParameterizedType.

使用Java的反射API获取此类内容的方法有点复杂:创建泛型类的匿名子类,然后获取其超类型的第一个参数.

这是一个例子:

@Suppress("unused") @PublishedApi
internal abstract class TypeReference<T> {}

inline fun <reified T> jGeneric() =
    ((object : TypeReference<T>() {}).javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
Run Code Online (Sandbox Code Playgroud)

当我println(jGeneric<List<String?>>())打印时java.util.List<? extends java.lang.String>,考虑到Kotlin List使用声明站点out方差并且Java类型没有可空性概念,这是合乎逻辑的.

现在,我希望获得相同类型的结果,但使用Kotlin反射API(当然,它包含可空性信息).

当然,List<String>::class因为它产生了一个不能工作KClass.我正在寻找一个KType.

但是,当我尝试这个:

inline fun <reified T> kGeneric() =
    (object : TypeReference<T>() {})::class.supertypes[0].arguments[0].type
Run Code Online (Sandbox Code Playgroud)

当我println(kGeneric<List<String?>>()),它打印[ERROR : Unknown type parameter 0],这是相当......好吧,虎头蛇尾;)

在Kotlin,我怎样才能得到一个KType反映List<String>

kotlin kotlin-reflect

1
推荐指数
1
解决办法
1517
查看次数