2015-01-21 89 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