簡體   English   中英

如何在Scala中默認為不可變Seq?

[英]How to default to immutable Seq in scala?

我今天了解到,scala的Seq可能意味着可變或不變的Seq都可以滿足其類型別名。 (我偶然發現了一個談論它的博客 。)

在我的代碼庫中,我嘗試遵循函數式編程最佳實踐,盡管我確實假定Seq強制執行不可變序列,但可能並非如此,因此會導致意外副作用的切入點。

為了防止可變的Seq,我可以使用帶有以下內容的Sequence鍵入我的函數:

我希望在每個文件中使用Seq scala.collection.immutable.Seq

我也不喜歡在我的代碼庫中讀取immutable.Seq

對我來說, Seq行為應類似於Set別名,並且默認情況下是不可變的。

有沒有一種方法可以使我的項目使用默認的Seq別名指向其不變的副本,而又不妨礙供應商的進口?

我不建議您嘗試破壞默認的Scala行為。 除非您定義自己的函數以接收任何輸入並返回該輸入的不可變Seq,否則我認為僅使用immutable.Seq是最安全的

您可以隨時嘗試以下操作(未經全面測試):

def seq(inputs: Any*): scala.collection.immutable.Seq[Any] = {
  scala.collection.immutable.Seq(inputs)
}

scala> seq("hi", true)
res0: scala.collection.immutable.Seq[Any] = List(WrappedArray(hi, true))

scala> seq(1, 'c', "string", false)
res1: scala.collection.immutable.Seq[Any] = List(WrappedArray(1, c, string, false))

編輯:

正如jwvh所指出的,該選項不是理想的。 如果您堅持要創建自己的函數,那么建議使用像James Whiteley這樣的泛型類型會更好:

def seq[T](inputs: T*): scala.collection.immutable.Seq[T] =
  scala.collection.immutable.Seq(inputs).flatten

輸出:

scala> seq("hi", true)
res0: scala.collection.immutable.Seq[Any] = List(hi, true)

但我要重申-可能最好是在需要的地方使用immutable.Seq ,或者找到另一個要使用的集合類型。

好吧,在閱讀了(已有4年歷史的)博客文章之后,我真的認為這不是什么大問題。

默認的Seq()collection.Seq本身不是可變的,但它是可變和不可變變量的父代。 因此,創建並傳遞默認Seq集合的代碼不會受到影響,但是接受Seq參數的代碼可能會收到mutable.Seq 但這僅是不可變性的前提條件,例如線程安全性,這只是一個問題。

底線:在這些文件的頂部放置一個import collection.immutable.Seq ,其中:

  1. 您無法控制的客戶端代碼可能會向您發送可變的Seq ,並且
  2. 收到的收藏品的不變性至關重要。

暫無
暫無

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

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