Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';Kotlins背后的真正意图也是作用域函数_Kotlin - Fatal编程技术网

什么';Kotlins背后的真正意图也是作用域函数

什么';Kotlins背后的真正意图也是作用域函数,kotlin,Kotlin,我在问我自己,语言设计者在“还作用域函数”背后的意图是什么,以及是否几乎所有人都在滥用它 如果在堆栈溢出上搜索Kotlins作用域函数的示例,您将得到以下公认的答案: 的给定答案也是{} 另外-当您想使用“应用”,但不想使用阴影时,请使用它 这个 班级果篮{ 私有变量权重=0 fun addFrom(appleTree: AppleTree) { val apple = appleTree.pick().also { apple -> this.weight +=

我在问我自己,语言设计者在“还
作用域
函数”背后的意图是什么,以及是否几乎所有人都在滥用它

如果在堆栈溢出上搜索Kotlins作用域函数的示例,您将得到以下公认的答案:

的给定答案也是{}

另外-当您想使用“应用”,但不想使用阴影时,请使用它 这个

班级果篮{ 私有变量权重=0

fun addFrom(appleTree: AppleTree) {
    val apple = appleTree.pick().also { apple ->
        this.weight += apple.weight
        add(apple)
    }
    ...
}
...
fun add(fruit: Fruit) = ... }
在这里使用apply将对此进行阴影处理,以便this.weight将引用 苹果,而不是果篮

这也是我经常看到的用法。但是,如果我查看一下

同样
也适用于执行采取上下文对象的某些操作 作为参数。也可用于不改变 对象,例如记录或打印调试信息。通常 也可以从调用链中删除的调用,而不会中断 程序逻辑

从这个角度来看,给定的示例是错误的,因为如果删除它,它会破坏程序逻辑。对我来说,
也是一种Javas
peek
(),它就在那里,但不应该用于生产性程序逻辑


有人能给我一些启发吗?

在就Reddit这个主题进行了较长时间的讨论之后,文档在某种程度上进行了调整,就像句子一样

通常,您也可以从调用链中删除的调用,而无需 破坏程序逻辑


已删除。请参阅相应的PR:

在对Reddit进行了关于此主题的较长时间讨论后,文档进行了调整,调整方式如下:

通常,您也可以从调用链中删除的调用,而无需 破坏程序逻辑


已删除。请参阅相应的PR:

他们说如果您正在对对象执行操作,而不是对其执行操作(配置它),从语义上讲,将其视为参数而不是接收者更有意义。上面的示例完全符合这一想法。但该示例也是这样一种情况,即没有scope函数,代码将更加简洁易读。如果函数还返回了apple,因此您没有将其分配给
val
。但是最后一句话呢,这些调用通常可以在不破坏程序逻辑的情况下被删除?如果我从示例中删除add调用,结果将不再相同。我明白了,我想这不符合这样的想法,即它只用于在一侧进行一些日志记录。上面的示例有点像一个点SS使用它,但可能有助于缩短一个简单函数的代码,它可以检索一些东西,用它做一些事情,然后返回它。但是我猜想<>代码> 可以被认为是一种更可读的方法。我认为原始的意图也是在一个函数编程链的中间记录日志。一个没有中断的集合。他们说如果你正在对一个对象做一些事情,而不是对它做一些事情(配置它),从语义上讲,将其视为参数而不是接收者更有意义。上面的示例完全符合这一想法。但该示例也是这样一种情况,即没有scope函数,代码将更加简洁易读。如果函数还返回了apple,因此您没有将其分配给
val
。但是最后一句话呢,这些调用通常可以在不破坏程序逻辑的情况下被删除?如果我从示例中删除add调用,结果将不再相同。我明白了,我想这不符合这样的想法,即它只用于在一侧进行一些日志记录。上面的示例有点像一个点SS使用它,但可能有助于缩短一个简单函数的代码,它可以检索一些东西,用它做一些事情,然后返回它。但是我猜想<>代码> 可以被认为是一种更可读的方法。我认为原始的意图也是在一个函数编程链的中间记录日志。没有中断的收集。