当前位置: 首页 > 知识库问答 >
问题:

为什么系统在静态编程语言中显示“智能转换为文件”是不可能的?

金嘉
2023-03-14

在代码 A1 中,我使用了 let 语句,因此我认为它不会与文件名为空的Video.path

但是我得到以下错误,为什么?

智能转换为“文件”是不可能的,因为“文件名视频”是一个可变属性,此时可能已被更改

此时此刻,我必须使用代码 A2。

代码A1

private var filenameofVideo :File?=null

filenameofVideo?.let {
          Navigation.findNavController(requireActivity(), R.id.fragment_container)
               .navigate(UIFragmentCameraDirections.actionCameraToVideo(filenameofVideo.path))
}

代码A2

private var filenameofVideo :File?=null

filenameofVideo?.let {filenameofVideo ->
        Navigation.findNavController(requireActivity(), R.id.fragment_container)
            .navigate(UIFragmentCameraDirections.actionCameraToVideo(filenameofVideo.path))
}

此外,我发现代码B1和代码B2都是正确的。为什么代码B1是正确的,代码A1是错误的?

代码B1

   private val aa:String?=null
   aa?.let {
            print(aa)
        }

代码B2

private val aa:String?=null    
   aa?.let{aa->
           print(aa)
      }

添加内容:

1:在Code C中,var aa可能在?. let调用中访问它的那一刻和在let块中访问它的那一刻之间被更改(可能被另一个线程)。

代码 C 将在 aa 不为空时启动,而代码 C 在 aa 为空时不会启动,对吗?

2:在Code D(我假设编译器接受它)中,无论aa是否为空,函数总是被启动,它都不能被接受,所以系统会中断,对吗?

代码C

private var aa: String? = null    
aa?.let { kk ->
    print(kk.length)
}

代码D

private var aa: String? = null    
aa?.let {
    print(aa.length)
}

共有2个答案

郎意
2023-03-14

代码就像

private var aa: String? = null
aa?.let {
    print(aa.length)
}

不编译是因为,而安全调用?。仅当 aa 属性不为 null 时才执行 { } 块,当执行达到 aa.length 时,aa 属性的值可能已在另一个线程中更改为 null。

另一方面,在本例中

private var aa: String? = null    
aa?.let { aa ->
    print(aa.length)
}

aa属性的非空值是在传递给let,lambda的只读aa参数中的安全调用之后捕获的。

请注意,使< code > aa property < code > val 而不是示例B1中的< code>var也有助于消除错误,但这会导致永远不会执行< code>let块,因为初始化为null的私有val永远不会变成非null。

关于示例C和示例D之间的区别的附加问题:

  • let{}函数的执行方式没有区别。在这两种情况下,lambda函数仅在接收器表达式aa不为空时启动,因为您使用 安全呼叫操作员
  • 编译器不接受示例D,因为它无法确保在执行到达该行时,lambda中引用的<code>aa

呼延晋
2023-03-14

让我们精简一下您的代码,以便更容易讨论:

private var filename :File?=null

filename?.let {
    action(filename.path)
}

这里的问题是,即使你已经打电话给?。let,编译器不能保证让块内的文件名不为空。这是因为文件名var,并且 var 的值可能在 ? 中访问 var 的那一刻之间已更改(可能由另一个线程更改)。让调用和在 let 块内访问它的那一刻。

因此,您必须自己处理null的可能性。最简单的方法是在< code>let块中使用< code>it值,或者自己命名该值:

filename?.let { safe ->
    action(safe.path)
}

该代码有效的原因是:

private val aa:String?=null
aa?.let {
    print(aa)
}

这里的变量是val。这意味着它将是<code>null</code>或非null,但无论哪种方式都不能更改。因此,我们可以阅读代码并看到<code>。let块将永远不会被执行……但如果它以某种方式被执行,则意味着<code>aa

 类似资料:
  • 我是一个初学静态编程语言的学生,正在学习一个示例回收人员视图。我开始编码,但没有得到我应该得到的结果,即使在检查和重新检查代码之后也是如此。然后我注意到,即使使用非常基本的代码,它仍然没有按照应有的方式运行。我将包含基本代码,当使用时,它应该显示一个通用列表。我只得到列表中的一项。我怀疑代码以外的其他东西正在影响结果;但是我还没有达到知道的水平。 请看活动内容。xml: 注意它有行。 下面是列表(

  • 我正在尝试在 Kotlin 中生成一个单例,并且遇到了问题,因为我无法。 这似乎是制作单例的一种非常标准的方法。为什么它不让我,我该如何解决它?

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?

  • 我是科特林的新手。因此,我在Android Studio中创建了一个kotlin项目,并导入了片段ktx和活动ktx依赖项。在片段中,我右键单击片段,然后转到- 这是我的应用程序。梯度锉

  • 它与扩展函数有什么关系?为什么带有的是函数,而不是关键字? 这个主题似乎没有明确的留档,只有关于扩展的知识假设。

  • 我正在尝试使用gunicorn 19.19运行django管理应用程序。0和nginx1.10。使用python 3.5在树莓皮3(raspian 9)上创建3。3和django 2.1。7.Nginx似乎工作正常,Nginx和gunicorn错误日志为空。但是,应用程序不会显示任何静态内容。 我检查了nginx.conf文件。 我运行了collectstatic并检查了所有文件是否都在那里。 我