在代码 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)
}
代码就像
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
让我们精简一下您的代码,以便更容易讨论:
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并检查了所有文件是否都在那里。 我