title | date | author | tags | keywords | categories | reward | reward_title | reward_wechat | reward_alipay | source_url | translator | translator_url |
---|---|---|---|---|---|---|---|---|---|---|---|---|
[译]M6.2 Available |
2013-12-06 07:55:00 -0800 |
Hadi Hariri |
官方动态 |
false |
Have a nice Kotlin! |
今天我们发布了 Kotlin M6.2,它带来了一些有趣和重要的功能。新发布 IntelliJ IDEA 13 现在也受到支持。让我们来看看。
{% raw %}
{% endraw %}
语言有一些期待已久和重要的变化。
功能编程的所有粉丝的好消息:Kotlin 现在支持 尾调用优化 (TCO)。这意味着我们现在可以在功能性样式中编写代码,而不会冒出调用堆栈的风险。例如,以下是迭代器的左折叠可能是:
{% raw %}
{% endraw %}tailRecursive
fun Iterator.foldl(acc : A, f : (e : T, acc : A) -> A) : A =
if (!hasNext()) acc
else foldl(f(next(), acc), f)
{% raw %}
{% endraw %}请注意,该功能是使用[tailRecursive]注释**:当您希望优化尾呼叫时,这是强制性的。 我们不以静默方式执行 TCO,原因有二:
- 调试。由于尾调用优化的函数不会进行实际的递归调用,所以调试器不会显示代表递归的任何堆栈帧,您将无法在先前的递归级别等上检查局部变量。因此,我们认为最不令人惊讶的方式这是在代码中明确的。
- 安全。我们都知道一个关于代码的有趣的事情:它通常不会做它似乎在做什么😉与尾部呼叫相同:通常,一个呼叫看起来好像是一个尾巴呼叫,但事实上它不是。这意味着不能进行优化,性能会受到影响。使用[tailRecursive]注释,编译器知道哪些调用必须可以优化,并在出错时发出警告。
我们希望以功能为导向的图书馆 funKTionale 将受益于此功能,以及 Kotlin 的标准库。 谢谢 谢尔盖·马什科夫 为实现这一目标而作出的贡献。
如你所知,Kotlin 对类型非常严格:即使数字类型也不会隐含地强制执行。实现我们的方法是以同样的方式定义所有类型(如类),并避免 Java 有时会出现奇怪的工件。幸运的是,我们可以通过不断的表达来清除智能的大部分小小的不便。现在这个工作已经完成了,你可以这样做:
{% raw %}
{% endraw %}val x: Long = -1
{% raw %}
{% endraw %}要么
{% raw %}
{% endraw %}val b: Byte = -1
{% raw %}
{% endraw %}事实上,发生什么事情是,编译器会计算右侧常量表达式的值,检查,它符合预期类型(Long 或 Byte)的范围,并转换常量。非常量不会发生同样的事情,因为它们不能被检查。 此外,编译器在存在算术溢出时会警告您:
{% raw %}
{% endraw %}val monthInMilliseconds = 1000 * 60 * 60 * 24 * 30 // WARNING
{% raw %}
{% endraw %}这里的结果超出了 Int 类型的范围,编译器会向您发出警告。您可以通过使第一个数字 Long 来修复溢出:
{% raw %}
{% endraw %}val monthInMillisecondsL = 1000.toLong() * 60 * 60 * 24 * 30 // OK
{% raw %}
{% endraw %}但是,是的,太好了,太久了。我们现在支持熟悉的“L”后缀的数字:
{% raw %}
{% endraw %}val monthInMilliseconds = 1000L * 60 * 60 * 24 * 30 // OK
{% raw %}
{% endraw %}请注意,Longs 的“l”后缀,在许多字体中看起来非常像“1”是臭名昭着的,是不允许的。 同样,浮标的“F”后缀也是如此。由于“f”不像任何数字,总体看起来更加愉快,不会被禁止。 <img alt =“:)”class =“wp-smiley”data-recalc-dims =“1”src =“https://i2.wp.com/blog.jetbrains.com/kotlin/wp-includes/images /smilies/simple-smile.png?w=640&ssl=1“style =”height:1em; max-height:1em;“/> 上面的故事对整体类型都是有好处的,但是浮点值是棘手的, 我们都知道 。例如:
{% raw %}
{% endraw %}println(0.1 < 0.1f) // prints "true"
{% raw %}
{% endraw %}它与这些十进制数字的二进制性质有很大关系,转换无损的情况对人类看起来不直观。因此,我们不会自动转换浮点值。默认情况下使用 Double,如果你想要一个 float,说明如此:
{% raw %}
{% endraw %}val fl: Float = 1.0f
{% raw %}
{% endraw %}<span style =“color:#000000; font-size:1.8em; line-height:1.5em”> Java 互操作性
你记得 Kotlin 的收藏有 只读接口 。如何揭示集合的 Java 库呢?随着着名的 @ Nullable / @ NotNull,Kotlin 现在提供注释来标记 Java 集合*@ReadOnly或@Mutable。* 给出以下 Java 代码
{% raw %}
{% endraw %}public List<EMail> activeEmails() {
...
}
{% raw %}
{% endraw %}当从 Kotlin 调用它时,返回值为 List ,Kotlin 将其视为 MutableList*。我们现在可以使用*@ReadOnly*注释来装饰该方法,以便列表不能通过引用进行突变:
{% raw %}
{% endraw %}@ReadOnly
public List<EMail> activeEmails() {
...
}
{% raw %}
{% endraw %}这意味着我们不能再像以前那样调用其中的add()
{% raw %}
{% endraw %}当涉及到参数时,我们可以做同样的事情。采取以下 Java 方法
{% raw %}
{% endraw %}void processEmails(List<EMail> emails) {
...
}
{% raw %}
{% endraw %}在 Kotlin,这将被代表
{% raw %}
{% endraw %}fun processEmails(emails: List<EMail>)
{% raw %}
{% endraw %}这可以变成
{% raw %}
{% endraw %}fun processEmails(emails: MutableList<EMail>)
{% raw %}
{% endraw %}通过使用*@Mutable*注释原始的 Java 代码
{% raw %}
{% endraw %}void processEmails(@Mutable List<EMail> emails) {
...
}
{% raw %}
{% endraw %}顺便说一下,这些注释也为您的 Java 代码提供了优秀的文档。
编译器现在在 Java 字节码中发出*@Nullable和@NotNull*注释。这允许 IntelliJ IDEA 在从 Java 调用 Kotlin 代码时使用这些并警告可空性违规。 例如
{% raw %}
{% endraw %}class Customer {
fun checkSocialSecurity(accountNumber: String) { ... }
}
{% raw %}
{% endraw %}当从 Java 调用时
{% raw %}
{% endraw %}Customer customer = new Customer();
customer.checkSocialSecurity(null); // WARNING
{% raw %}
{% endraw %}会引起警告。
我们现在为整个 Android SDK 提供注释,使 Android 项目的工作变得更加轻松和安全。
最后但并非最不重要的一点,虽然与 Java Interop 不完全相关,但我们还将 Java 改进为 Kotlin 转换器,提供更清晰的代码和更好的格式化。
我们将继续改进 JavaScript 编译器的支持。现在,您可以通过设置中的Kotlin 编译器页面配置是否生成源代码图,以及您希望将其放在哪里。 偏好设置
{% raw %}
{% endraw %}此外,您可以为生成的 Kotlin JavaScript 代码指定输出文件前缀和后缀。 我们还修复了一些 JavaScript 相关的问题,包括
- 功能的默认参数现在已修复
- 支持超级构造函数调用
- 支持特征中的类对象
使用typeDef导入任务而不是使用taskDef,使我们不仅可以访问现有的“em”kotlinc&gt;任务,而且新的与<kotlin /&gt;* Ant 的任务,它允许在使用 Java 编译器任务*&lt; javac&gt;时使用后者中定义的src*属性来编译 Kotlin 文件。
您也可以使用 Ant 编译 Kotlin 到 JavaScript。有一个新的任务*&lt; kotlin2js&gt;其中给出了src和输出*属性,将把 Kotlin 编译成 JavaScript。还提供了各种附加选项,类似于 IDE 中启用源映射,生成文件的前缀和后缀等的其他选项。
我们现在可以向编译器提供 IntelliJ IDEA 附加命令行参数,以及是否要生成警告
{% raw %}
{% endraw %}此外,还增强了/更新了其他一些 IDE 功能:
- 智能完成:虽然只是开始,我们正在努力在 Kotlin 中提供更智能的完成,这些都是我们已经为 Java 提供的。
{% raw %}
{% endraw %}- 查找用途:改进的性能。能够查找本地和私有声明,支持值/类型参数和属性 getter / setter,以及一些错误修复。
- 更改签名重构:现在支持函数层次结构。
- 重命名重构:修复从 Java 代码重命名 Kotlin 类和函数以及重写 Kotlin 基本函数时出现的问题。
虽然我们只介绍了这个版本的一些改进,但是已经有一个 另外 120 个问题 已解决包括功能和错误修复,因为 里程碑 6.1。 ##
下载
如果您使用 IntelliJ 13,您已经有 Kotlin M6.2 开箱即用。否则,您可以从中下载编译器 发行页面 和 IntelliJ IDEA 存储库中的插件 。