2010-02-09 52 views
2

這種管理靈活,類型化,一成不變的數據結構在Scala是後續現在斯卡拉2.8.0測試版了這個問題:在2.8.x

What is a proper way to manage flexible, typed, immutable data structures in Scala?

這項新技術是複製案例類,例如

case class Person(name:String, email:String) 

val bob = Person("Bob", "[email protected]") 
val jill = bob.copy(name = "Jill") 

除外斯卡拉我看來,限制到22(?)的情況下類屬性的事實,這個偉大的工程。這可能看起來很多,在我的情況下是不夠的。

23,我得到:「錯誤:類型Function23不是包scala的成員」。我可以定義我自己的Function23等,但我不知道它的含義。

所以現在我回到原點了。我需要使用公共變量,我試圖避免它,或者創建一個26+參數構造函數和一個配對副本方法。伊克。

22似乎在這裏是一個相當隨意的限制。有沒有解決的辦法?

這是數據導入,這看起來是這樣的:

new CatalogImportRecord() { 
    override val List(SVal(vendorSku), SVal(title), IVal(issues), 
     _, // YToMVal(termMonths), 
     DVal(sellPrice), DVal(buyPrice), DVal(retailPrice), NotesVal(allowsNew, allowsRenewals), 
     _) //DateValMdy(lastUpdated)) 
     = fields 

你可以看到我註釋掉未使用的提取,以減少字段數。

也許有更好的方法來做到這一點。我發現這種提取技術有點僵化,但這可能是最好的。

+0

我沒有編程綜合。這是我正在導入的有很多字段的記錄的內部反映。分組相關的字段會讓我的提取代碼非常難看。 @雷克沒有冒犯,但這個例子並不漂亮。 我打倒了現在的字段數,但這似乎是一個相當愚蠢的限制,一個語言有....我拼命試圖避免通用哈希表,並且現在... 添加了導入上面的代碼示例。 –

+0

@Rex的意思是說,生成產品類的代碼 - 當前預測的原因 - 是自動生成的。他建議你用不同的設置生成一個新的庫,順便說一下,如果你打算使用case case,它確實是唯一的選擇。 –

回答

4

該代碼是自動生成的,因此如果您只是自己使用該項目,則可以重新編譯Scala庫(使用更改的設置)。

如果您在案例類中手動輸入23件以上的東西,可考慮以任何方便的方式對您的值進行分組 - 使用元組將有意義的事情分組在一起,或使用子案例類將事情分組更多緊緊。它會使更新變得更尷尬,但是如果你將需要更新的東西分組,它應該會有所幫助。

例如,嘗試了這一點在斯卡拉2.8:

((1,2,3,4,5,6,7,8,9),(1,2,3,4,5,6),(1,2,3,4,5,6,7,8,9)).copy(_2=(4,5,6,7,8,9)) 

如果你已經有了一個VAL原來,改變的只有一件事那就更簡單了:

val a = (1,2,(1,2)) 
a.copy(_3=a._3.copy(_1=3)) 
+0

我不知道元組 - a.copy(_3 = a._3.copy(_1 = 3))會發送很多人在運行,但也許是子情況類是一個很好的解決方案。 –

+0

元組只是預定義的案例類。用自己的代碼更清晰 - 它看起來更像'record.copy(customer = record.customer(lastname =「Smith」))''。 –

1

是你是否手動編寫這些龐大的案例類?

如果您正在以編程方式綜合它們,那麼您始終可以複製編譯器對案例類所做的工作,並獲得基本上沒有Product22限制的相同結果。對於案例類,它爲Scala源代碼提供了一個非案例類的等價物。

+0

我不會說他們是龐大的...而且只是一個班級。但我不喜歡寫一個構造函數和複製方法保持同步的想法。 –

2

請參閱src/build目錄中的genprod.scala,對其進行修改,使用它來生成所需的arity,然後重新編譯該庫。您可能需要保留一個修改後的Scala庫。

也許有可能分開那些額外的類,編譯它們,並將它們保存在另一個jar文件中。我不知道,但我希望這是值得一試的。

或者使用Map而不是案例類。

+0

感謝您的建議。我不想使用地圖(輸入類型安全,這是Scala的一半)。我也不想保留我自己的核心Scala庫。就目前而言,我只是減少了一些領域。這在語言中是一個奇怪的限制...總的來說,Scala 2.8在默認和命名參數上的可用性有了很大的提高。 –