![](/img/trans.png)
[英]How can I use case objects as a field in my case class and convert to Spark DataSet?
[英]How can I allow the caller to call method of field of case class?
我不確定該模式的關鍵字,如果問題不清楚,則抱歉。
如果你有:
case class MyFancyWrapper(
somethingElse: Any,
heavyComplexObject: CrazyThing
)
val w = MyFancyWrapper(???, complexThing)
我希望能夠使用來自complexThing
的方法調用w.method
。 我試圖extends CrazyThing
但這是一個特性,我不想實現所有非常繁瑣的方法。 我也不想做:
def method1 = heavyComplexObject.method1
...
對於他們所有人。
有什么辦法嗎?
謝謝。
您可以使用宏來執行此操作,但是我同意Luis的說法是過分殺傷力。 宏旨在重復無聊的事情,而不是一次無聊的事情。 同樣,這並不是聽起來那么簡單,因為您可能不想遍歷所有方法(您可能仍然想要自己的hashCode
和equals
)。 最后,宏對IDE的支持不佳,因此所有這些方法很可能都無法自動完成。 另一方面,如果您確實使用了良好的IDE(例如IDEA),則很有可能會執行諸如“委托方法”之類的操作,該操作將為您生成大部分代碼。 你仍然必須從改變返回類型Unit
,以MyFancyWrapper
並添加返回this
在每個方法的結束,但這可以很容易地完成質量替換操作(提示:將“ }
用”“ this }
”和自動重新格式化代碼應該可以解決問題)
這是JetBrains IDEA流程的一些屏幕截圖:
您可以使用隱式轉換來使heavyComplexThing
所有方法直接在MyFancyWrapper
上MyFancyWrapper
:
implicit def toHeavy(fancy: MyFancyWrapper): CrazyThing = fancy.heavyComplexObject
調用方法時,它必須在范圍內。
在注釋中,您指示要返回this
以便可以在同一對象上鏈接多個調用:
w.method1.method2.method3
不要這樣
盡管這是非功能語言中的常見模式,但是Scala的不良做法是出於兩個原因:
這種模式固有地依賴於副作用,這是功能編程的對立面。
這很令人困惑,因為在Scala中,這種方式的鏈接調用用於實現數據管道,其中一個函數的輸出作為輸入傳遞給下一個函數。
編寫單獨的語句要清晰得多,這樣很明顯,可以在同一個對象上調用這些方法:
w.method1()
w.method2()
w.method3()
(在調用具有副作用的方法時,也通常使用()
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.