当伴生对象在类中时使用 .tupled 方法
Posted
技术标签:
【中文标题】当伴生对象在类中时使用 .tupled 方法【英文标题】:Using .tupled method when companion object is in class 【发布时间】:2014-04-17 12:09:37 【问题描述】:我正在从 Slick 迁移到 Slick 2,在 Slick 2 中,您应该在投影到案例类时使用 tupled
方法(如此处所示 http://slick.typesafe.com/doc/2.0.0-RC1/migration.html)
问题是当案例类有一个伴生对象时,即如果你有这样的东西
case class Person(firstName:String, lastName:String)
伴随对象
object Person
def something = "rawr"
在同一范围内,tupled
方法不再起作用,因为它试图在 object
上运行 tupled
,而不是 case class
。
有没有办法检索Person
的case class
而不是object
,这样就可以正确调用tupled
?
【问题讨论】:
你绝对需要伴生对象吗?另外,我认为这是一个与 Slick 无关的一般 Scala 问题。 是的,除非我想像我的项目的一半那样重构(伴生对象有很多用于相关案例类的辅助方法),是的,你是对的,它与slick,刚刚提到它是因为 Slick 可能有自己的解决方法 不能只重命名伴生对象,然后将重命名对象的内容直接导入案例类吗?或者,您可以手动使您的自定义伴随对象看起来像一个自动生成的对象。 是的,但习惯上来说,如果你有处理Person
的全局函数,它们应该在Person
命名空间上工作,这就是单例模式的全部目的。带有BigDecimal
的全局方法(例如),这些方法附加到BigDecimal
,而不是BigDecimalHelpers
或类似的东西
其实他们并没有消失,看看这个答案***.com/a/22368413/1519631。至于为什么tupled
方法“消失”,我不知道。在快速阅读之后,可能取决于它是如何被隐式带入作用域的(这是在内部完成的)。请记住,即使有同伴object
,您仍然可以使用case classes
。这个问题只是因为我特别需要使用元组方法而出现
【参考方案1】:
你也可以写
(Person.apply _).tupled
避免重复类型。
【讨论】:
如果伴生对象有自己的 apply 方法(重载的构造函数)怎么办?编译器无法解析应用... 找到答案:***.com/questions/41179532/… 这不是编译:apply
not found
@javadba 是的,它是:scalafiddle.io/sf/a5rsgke/0。你确定你有案例课吗?【参考方案2】:
这与 Alexey Romanov 所说的非常相似,但为了避免在您需要 tupled
时提升 apply
,我们只需将其添加到我们的伴随对象中。
object Person
def something = "rawr"
def tupled = (Person.apply _).tupled
现在您可以调用Person.tupled
,就像它没有伴随对象时一样。
【讨论】:
【参考方案3】:一种解决方法是定义一个伴随对象,如下所示:
object Person extends((String,String) => Person)
...
看。 https://groups.google.com/d/msg/scala-user/jyWBMz5Qslw/Bryv4ftzRLgJ
【讨论】:
谢谢,这确实有效(我认为样板文件没有任何解决方法,即 (String,String) )【参考方案4】:要在其他一些 cmets 的基础上进行构建,您也可以执行以下操作,因为 tuple 正在为案例类调用生成的默认应用方法。
object Person
...
def tupled = (this.apply _).tupled
【讨论】:
以上是关于当伴生对象在类中时使用 .tupled 方法的主要内容,如果未能解决你的问题,请参考以下文章