2015-01-21 56 views
8

例如在Objective-C,其中的類擴展是直接的語言結構,我們這樣做:是否有隱式類的命名約定?

在提起命名NSArray+FKBinarySearch.h

@interface NSArray (FKBinarySearch) 
// ... 
@end 

你的名字就像你的擴展類:

implicit class IndexedSeqBinarySearch[A](seq: IndexedSeq[A]) { 
    // ... 
} 

例如scalaz調用使擴展類具有後綴OpsBooleanOps或甚至擴展它們自己的特徵FoldableOps

還有Ops感覺太籠統了,OTOH有套餐。另外在斯卡拉茲情況下Ops包含了一切。

回答

2

不,沒有一個確定的約定。 @ srgfed01列出了一些辦法(其它約定,我在野外看到:爲X隱式轉換中稱爲ImplicitX而非Implicits,並PimpedX爲包裝X隱含的類的對象),但你會看到所有的這些以及更多在現存的scala庫中 - 有時在同一個庫中有多個不同的約定。隱含的轉換x2y風格沒有任何建立,也許是因爲隱式類是一個相對較新的功能。

因此,請選擇您喜歡的風格,並準備好在您使用的庫中按照許多不同慣例查找含義。

+0

不知道*隱式類是相對較新的。這就解釋了爲什麼沒有太多關於他們的着作。 – phadej 2015-01-21 11:28:51

1

標準庫有StringOps

郵件列表中的某個人將我轉到了'荒謬的描述性反引用標識符',這可以避免命名碰撞中的衝突。

OTOH,也許你想讓客戶端通過遮蔽它來關閉隱式。

9

Programming in Scala的「第21章·隱式轉換和參數」 - >「命名隱式轉換」。它說:

隱式轉換可以有任意名稱。隱含的 轉換的名稱僅在兩種情況下起作用:如果您想在方法應用程序中明確地寫入 ,並確定在程序的任何位置哪些隱式轉換可用。

Programming Scala「第5章:Implicits」 - >「Implicits的明智使用」這是說:

一個改善implicits方式能見度採用的 實踐中把隱含值在名爲implicits的特殊程序包或名爲Implicits的對象 。

使用隱式類就像使用隱式方法,但在類的情況下涉及其主構造函數。如果你看一下Scala的隱式轉換方法的結果,你可以找到類似:

  • wrapString(S:字符串):WrappedString
  • genericArrayOps [T](XS:數組[T]):ArrayOps [ T]

在我裏面Implicits對象意見爲您隱類名稱可以使用如下:

  • xOps
  • RichX
  • WrappedX
  • ASX

您可以選擇其中任何一個是適合你的項目的條件。

+0

命名隱式轉換很容易,但如何命名和構造隱式(擴展)類(或轉換目標)? * Scala編程*給出任何建議嗎? – phadej 2015-01-21 08:18:39

+0

「將隱式值放入名爲implicits的特殊包或名爲Implicits的對象中。當然,隱式類應該放在對象中。 – user5102379 2015-01-21 08:23:26

+0

你是否建議:'包裝對象Implicits {隱式類ListOps [A](list:List [A]){/ * ... * /}}'? – phadej 2015-01-21 08:25:27