2011-03-08 86 views
2

斯卡拉讀可讀的字符串,當你寫了一個字符串「Hello World」到一個文件中寫入如何寫在斯卡拉

的Hello World

(注:沒有雙引號)。

Lisp有打印和寫入的概念。其中寫道:沒有雙引號,其他包括他們可以很容易地寫出來的數據結構和讀回後使用標準的讀卡器。

反正有沒有做到這一點在Scala呢?

有了一個字符串,這很容易對其進行格式化 - 但很多深層嵌套結構,它幾乎是不可能的。

例如,說我有

sealed trait PathSegment 
case class P(x:String) extends PathSegment 
case class V(x:Int) extends PathSegment 

要創建一個作用:

P("X") 

V(0) 

這些PathSegments打印爲列表:

List(P(paths), P(/pets), P(get), P(responses), V(200)) 

我想這打印出:

List(P("paths"), P("/pets"), P("get"), P("responses"), V(200)) 

換句話說,我想串(和字符),無論身在何處的結構發生打印出來作爲"foo"'c'

+2

如何使用三重引號? println(「」「他說,」斯卡拉岩石!「」「」) – mpilquist 2011-03-08 00:39:59

+0

如果你錯誤地使用了你的答案,你的答案是不能接受的。 – 2011-03-08 02:58:26

回答

1

這什麼序列化是關於。另外,爲什麼JSON很受歡迎。

1

退房升JSON(https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/)寫入數據指出,將被解析並通過另一種語言讀出。 JSON在Web服務領域是非常標準的請求/響應序列化,並且幾乎每種語言都有JSON庫。

要逐字寫出一個字符串包括雙引號,你也可以做這樣的事情:

""" 
The word "apple" is in double quotes. 
""" 

我找到像JSON稍微更結構化的格式更實用,像電梯,JSON庫做的在引用字符串,而不是引用int類型而言正確的事,等

1

我認爲你正在尋找的東西像JavaScript的eval() + JSON和Python的eval()str()repr()。本質上,你需要Lispy對稱的元圓形評估。這意味着您可以將數據轉換爲源代碼,並評估該源代碼並返回相同的數據,對不對?

AFAIK,有Scala中沒有eval()等同。 Daniel Spiewak在此之前已經談到了here。但是,如果你想要的話。我建議以下幾點:

  1. 每個集合對象都有3個方法可以讓你無論如何都能將它的數據轉換爲字符串表示。有mkString,addStringstringPrefix。對他們做一些巧妙的事情(想一想「將你的內存中ADT反編譯成源代碼形式」),你就會到達步驟2)。實質上,您可以將由List(1,2,3)創建的整數列表轉換回字符串"List(1,2,3)"。對於更簡單的字符串或整數等更基本的文字,您需要使用implicits來提供內置類型,以便爲它們提供這些toString(我將這裏的術語超載)輔助方法。
  2. 現在你有了你的字符串表示,你可以考慮如何「解釋」或「評估」它們。你需要一個eval()函數來創建一個解析器組合器的新實例,該實例理解Scala的文字併爲你重新組裝數據結構。

實現這個實際上聽起來很有趣。如果您已成功實施它,請不要忘記在這裏回覆。 :)