簡體   English   中英

如何允許調用者調用案例類字段的方法?

[英]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的說法是過分殺傷力。 宏旨在重復無聊的事情,而不是一次無聊的事情。 同樣,這並不是聽起來那么簡單,因為您可能不想遍歷所有方法(您可能仍然想要自己的hashCodeequals )。 最后,宏對IDE的支持不佳,因此所有這些方法很可能都無法自動完成。 另一方面,如果您確實使用了良好的IDE(例如IDEA),則很有可能會執行諸如“委托方法”之類的操作,該操作將為您生成大部分代碼。 你仍然必須從改變返回類型Unit ,以MyFancyWrapper並添加返回this在每個方法的結束,但這可以很容易地完成質量替換操作(提示:將“ }用”“ this } ”和自動重新格式化代碼應該可以解決問題)

這是JetBrains IDEA流程的一些屏幕截圖:

委托方法步驟#0

委托方法步驟1

委托方法步驟2

您可以使用隱式轉換來使heavyComplexThing所有方法直接在MyFancyWrapperMyFancyWrapper

implicit def toHeavy(fancy: MyFancyWrapper): CrazyThing = fancy.heavyComplexObject

調用方法時,它必須在范圍內。


在注釋中,您指示要返回this以便可以在同一對象上鏈接多個調用:

w.method1.method2.method3

不要這樣

盡管這是非功能語言中的常見模式,但是Scala的不良做法是出於兩個原因:

  1. 這種模式固有地依賴於副作用,這是功能編程的對立面。

  2. 這很令人困惑,因為在Scala中,這種方式的鏈接調用用於實現數據管道,其中一個函數的輸出作為輸入傳遞給下一個函數。

編寫單獨的語句要清晰得多,這樣很明顯,可以在同一個對象上調用這些方法:

w.method1()
w.method2()
w.method3()

(在調用具有副作用的方法時,也通常使用()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM