gpt4 book ai didi

scala:私有(private)实用方法应该存在于伴随对象中吗?

转载 作者:行者123 更新时间:2023-12-02 21:30:51 24 4
gpt4 key购买 nike

这个问题是不言自明的,但请允许我提供一个例子:

我有以下内容:

class Foo {
def doAndPrint {
val result = doSomething()
val msg = message(result)
println(msg)
}

private def message(result: Result): String = {
"message formatted with %s".format(result)
}
}

在这种情况下,问题是:应该def message(result: Result)存在于对象Foo中吗?

支持的论点明确表明 def message(result: Result) 不依赖于 class Foo 中的任何状态。反对的论点是,伴随对象的动机是提供一个放置 java 公共(public)静态方法的地方。

最佳答案

这种错误的二分法的答案是两者都不是。它应该是 doAndPrint 的本地方法.

class Foo {
def doAndPrint {
val result = doSomething()
def message(result: Result): String = s"message formatted with $result"
val msg = message(result)
println(msg)
}
}

事实上,

class Foo {
def doAndPrint {
val result = doSomething()
def message = s"message formatted with $result"
println(message)
}
}

请注意,这实际上取决于本地的州。

编辑:好的,作为对“不言自明”的认可,我想补充一下,使用有意义的最小范围,并且该示例指出了同伴之间私有(private)关系的不对称性。这需要很多双关语,但我没有时间提供。

更直接地回答,根据我的观察,配套模块通常不会充当FooUtil的存储库。 -风格的函数,尽管它确实充当隐式转换的存储库,尽管是公共(public)的,但它具有可以说相似的风格。考虑一下集合类型的对象最终会发生什么。

考虑关注点分离:

class Foo(f: String => Unit) {
def doSomethingAndDoSomethingWithIt {
val result = doSomething()
def message = s"message formatted with $result"
f(message)
}
}

关于scala:私有(private)实用方法应该存在于伴随对象中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22313946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com