- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一些关于 kotlin 顶级属性的问题,下面是示例代码:
// Situation 1
class TreeNode(var `val`: Int) {
var left: TreeNode? = null
var right: TreeNode? = null
}
val tree2 = TreeNode(2)
val tree1 = TreeNode(3).apply { left = tree2 }
fun main() {
println(tree1.left) // prints "TreeNode@..."
}
// Situation 2
class TreeNode(var `val`: Int) {
var left: TreeNode? = null
var right: TreeNode? = null
}
val tree1 = TreeNode(3).apply { left = tree2 }
val tree2 = TreeNode(2)
fun main() {
println(tree1.left) // prints "null"
}
// Situation 3
class TreeNode(var `val`: Int) {
var left: TreeNode? = throw Exception("I am an exception")
var right: TreeNode? = null
}
val tree1 = TreeNode(3).apply { left = tree2 }
val tree2 = TreeNode(2)
fun main() {
/* prints "Exception in thread "main" java.lang.ExceptionInInitializerError
* Caused by: java.lang.Exception: I am an exception ..."
*/
println(tree1.left)
}
好像是
我说的对吗?如果是,我想知道
谢谢!
最佳答案
top-level properties are initialized from top to bottom;
实际上,我在 Kotlin/Core 规范中找不到任何可以证实这一点的内容。我只能找到这个 Kotlin forum post这表示顶级属性初始化是平台相关的,并且您获得的唯一保证是属性的初始化程序将在您访问该属性之前运行,这并没有说明任何其他属性的初始化程序。
Kotlin doesn’t give you any guarantees when top level properties willbe initialized. All you can say is that the initialization code willbe called before you access a property, but you can’t necessariallytell when.
If you know which target platform you are on, you have a bit moreinformation. I don’t know enough about native to help you there but onthe JVM a top level property get’s initialized the when you call anytop level function or property within the file. It’s a bit morecomplicated than that. It has to do with the JVM classloader and whenthat calls static initialization blocks ( function).
不会说谎,这也让我感到惊讶!但从我的测试来看,目前的编译器版本 1.7.10 似乎确实在所有平台(JVM、JS、 native )上初始化顶级属性,除非它们是内联的。
if the depended property is not initialized, it will be replaced by the default value
这也不是真的。如果依赖属性没有被初始化,它得到的值是未指定。根据spec (强调我的):
The main difference between declaration scopes and statement scopes is that names in the statement scope are bound in the order of appearance. It is not allowed to access a value through an identifier in code which (syntactically) precedes the binding itself. On the contrary, in declaration scopes it is fully allowed, although initialization cycles may occur leading to unspecified behaviour.
非脚本 Kotlin 文件的顶级范围是“声明范围”,正如该页面前面指定的那样。
由于您似乎在 JVM 上,情况 2 中实际发生的(但未指定)是未初始化的 tree2
为 null
(所有引用类型的默认值在 JVM 上),并分配给 left
,此时它也恰好是 null
。
对于情况 3,根本没有特定于平台的行为。您调用 Tree
的构造函数,然后运行 left
的初始化程序,然后抛出异常,程序到此结束。它甚至没有到达 apply
部分。
充分证明未初始化属性的未指定行为是
fun main() {
println(y)
}
val y = run { x }
val x = run { 1 }
在 JVM 上,它打印 0。在 Kotlin/Native 上,它也打印 0,但我想它也可以打印恰好位于该位置的任何位。在 Kotlin/JS 上,它打印“undefined”。
至于为什么设计成“未指定”,大概是因为Kotlin团队还有其他更重要的事情要关注。无论如何,人们通常不会有太多相互依赖的全局属性。 See also this great answer by Eric Lippert.
关于kotlin - 顶级属性的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73119406/
我有一个用于重构练习的测试套件,我希望它与 Data.List 兼容。和 Data.List.NonEmpty .练习包含一个函数 foo :: [Foo] -> Foo并且测试套件有一些 data
我下载了 Android Studio 项目。项目根目录只有一个 build.gradle 具有下一个结构: apply plugin: 'com.android.library' android {
我似乎无法正确使用最接近的函数来删除删除按钮之外的 UL。 HTML X Data Jquery $('.remove').click(function(){
我需要一些帮助。顶级 Activity 必须位于自定义包之外吗?这样的话,MainActivity应该是在自定义包之外吧?Activity 是自定义包名称。
我正在尝试使用 AppCompat Drawer 和多个顶级 Activity (不是 fragment )创建一个基本应用程序 - 我不太清楚如何管理后台堆栈 - 我已经尝试了大约一百种不同的方法-
无法找到任何相关信息,我可以自己完成此操作,但我觉得将其保留在查询中可能是最好的选择(如果可能的话)。 基本上我想尝试添加查询的顶级“统计”部分。 所以当我得到结果时,我会看到这样的结果 num_ro
我在菜单中遇到 onmouseout/over delay 问题。我发现通过将 setTimeout 数字从 100 更改为 2000,它延迟了顶层菜单的隐藏而不是子级菜单,并且在新的 onmouse
是否有一个选项可以通过使用动画在运行时简单地 move Tkinter TopLevel() 窗口?我想到了由按钮触发的平滑 moveInAnimation。 这是一些代码片段: from Tkint
我从正在调用的 API 中获取了以下 JSON 文件: { "14500": [ { "5": { "versionName": "VersionOne",
在 C++ Primer 第五版中,它说: int f(int){ /* can write to parameter */} int f(const int){ /* cannot write to
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在使用 Retrofit 进行一些 API 调用。对于特定端点,返回的 json 看起来有点像这样: 端点:api.example.com/1.0/userinfo?userid=7 返回的响应看
假设我有一个 Python 文件,我想在顶层运行它,但在它完成后,我想从它停止的地方继续。我希望能够使用它创建的对象等。 一个简单的例子,假设我有一个执行 i = 5 的 Python 脚本。当脚本结
我在 Xcode 中使用 Cmake 来生成一个 c++/c“项目”(my_project) 和一些 c++/c“目标”(一个是二进制文件,其余是库) 我的 CMakeLists.txt 看起来像这样
我正在尝试学习 redux,但遇到了错误。我只有两个文件,一个 index.html 文件和一个 main.js 文件,html 文件中有指向 jquery 和 redux cdns 的链接。我在 r
我有这个通用函数可以保存在 NSUserDefaults 中,通常可以正常工作,但现在我想保存一个 boolean 值,但出现错误。我找不到任何东西,我不明白为什么它不起作用。 extension U
我正在使用 Retrofit 进行 API 调用。顶级对象的命名取决于请求的查询参数。例如,这样的请求: api.somewebsite.com/1.0/mix_info?mix_id=69 返回这样
我做汤: from bs4 import BeautifulSoup soup = BeautifulSoup("My paragraph My link", "html.parser") 我想删除第
看完new egghead course由 Dan Abramov 撰写,我对提到的选择器有疑问。 选择器的目的是向组件隐藏状态树的详细信息,以便在树发生变化时便于以后管理代码。 如果我理解正确,那意
我是一名优秀的程序员,十分优秀!