为什么必须将函数的结果存储在变量中?

时间:2020-06-11 23:54:03

标签: kotlin

是因为某些函数会更改对象,而有些则不会,因此您必须将返回的值存储在变量中?我敢肯定,有更好的方法问这个问题,但是我希望这是有道理的。

示例案例:thisString为什么不大写?当我在toUpperCase()上调用thisString函数时,输出会怎样?有这种行为的名字吗?

var thisString: String = "this string"
var thatString: String = "that string"

thisString.toUpperCase()
thatString = thatString.toUpperCase()

println(thisString)
println(thatString)

打印:

this string
THAT STRING

2 个答案:

答案 0 :(得分:1)

按照惯例,如果函数以单词 to 或过去分词开头,则它总是返回一个新对象,并且不会使调用它的对象发生突变。但这并非完全正确。以动词开头的函数可能会或可能不会使对象发生变异,因此您必须检查文档才能确定。

一个可变对象可能仍然具有返回新对象的功能。您必须检查调用函数的文档。

对于返回新对象的函数,如果您不对返回的结果执行任何操作或将其存储在变量中,则它将丢失给垃圾收集器,并且您将永远无法检索它。

String是一个不可变的类,因此您在其上调用的任何函数都不会修改原始对象。不可变类通常不太容易出错,因为您不能意外地修改仍在其他地方使用的实例。

所有原语也是不可变的。如果一个类的所有属性都是只读的vals,并且它们引用的所有类类型也是不可变的类,则该类是不可变的。

如果您想要String的可变替代项,则可以根据需要使用StringBuilderStringBufferCharArrayMutableList<Char>。它们都有各自的优缺点。

答案 1 :(得分:1)

为什么thisString不能大写?

因为the function的编码方式是这样(强调我的意思):

“返回此字符串的副本,该字符串使用默认语言环境的规则转换为大写。”

在thisString上调用toUpperCase()函数的输出会发生什么?

什么都没有。如果您未将其分配给变量(保存对它的引用),则会将其丢弃。

此行为有名称吗?

AFAIK,这只是“忽略返回值”。

希望有帮助。