0

可以說我有保持一個參數化的數據類型的數據結構:階使用類參數的佔位符(或輸入變量)

case class Terminal[A](value: A, name: String ="") 

我可以輕鬆地創建一個Terminal[Double]如果我通過它物化常數:

val terminal = Terminal(2.0) 

不過,我希望它也能收到(不兌現)input,這樣我可以用不同的上下文中端多次評估。我可以通過調用名value實現一個簡單的解決方案,即

class Terminal[A](value: => A, name: String ="") { 
    def getValue = this.value 
} 

var x = 1.0 

val terminal = new Terminal(x) 

terminal.getValue // 1.0 

x = 100.0 

terminal.getValue // 100.0 

然而這個計劃的用戶將有類似var input_x = None,這不是很好的初始化input,然後改變其狀態,這在輪將不得不讓我把value變成Option[A]

這是處理這種情況的最佳方法嗎?是不是我可以使用的任何設計模式或scala功能?

我也可以創建一個類Input來表示這些依賴於上下文的輸入,但是之後我需要改變很多東西。

+0

您似乎無法將特定的解決方案應用於某個問題。麻煩的是,您正在尋求實施解決方案的幫助,這幾乎肯定是錯誤的,但從未描述您嘗試解決的實際問題。我建議你退後一步,試着描述爲什麼(你認爲)你需要這個'終端'類,以及如何想象在現實生活中使用它。 – Dima

回答

1

您可以使用不可變對象如下:

scala> case class Terminal[A](value: A, name: String ="") { 
    | def update(newValue: A): Terminal[A] = this.copy(value = newValue) 
    | def getValue: A = this.value 
    | } 
defined class Terminal 

scala> val terminal = Terminal(1.0) 
terminal: Terminal[Double] = Terminal(1.0,) 

scala> val updatedTerminal = terminal.update(100.0) 
updatedTerminal: Terminal[Double] = Terminal(100.0,) 

scala> val oldValue = terminal.getValue 
oldValue: Double = 1.0 

scala> val newValue = updatedTerminal.getValue 
newValue: Double = 100.0 

GetValue方法是在這裏實際上是多餘的,因爲干將來自由搭配case classes。我只是在那裏展示了這個例子。

scala> oldValue == terminal.value 
res0: Boolean = true 

scala> newValue == updatedTerminal.value 
res1: Boolean = true 

一般情況下,寧願案例類,如果你想創建不具有可變狀態的對象(例如,所有的單成分是比較富裕的非case類)。