隐式类是否有命名约定?

时间:2015-01-21 07:24:22

标签: scala

例如,在Objective-C中,类扩展是直接语言构造,我们这样做:

在名为NSArray+FKBinarySearch.h的文件中:

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

您是否将扩展类命名为:

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

例如,scalaz调用会生成带后缀Ops的扩展类:BooleanOps甚至扩展自己的特征FoldableOps

然而Ops感觉太笼统,OTOH有包裹。另外,scalaz案例中的Ops包含所有内容。

3 个答案:

答案 0 :(得分:10)

在“第21章·隐式转化和参数”中的Programming in Scala中 - > “命名隐式转换。”据说:

  

隐式转换可以有任意名称。隐含的名称   转换只在两种情况下才有意义:如果你想写它   显式地在方法应用程序中,并用于确定哪个隐式   转换可在程序中的任何位置使用。

Programming Scala“第5章:隐含” - >据说“明智地使用隐含”:

  

提高隐含可见性的一种方法是采用这种做法   将隐式值放在名为implicits或a的特殊包中   对象名为Implicits。

使用隐式类就像使用隐式方法一样,但是在类的情况下,它涉及主要的构造函数。如果你看看Scala隐式转换方法的结果,你可以找到类似的东西:

  
      
  • wrapString(s:String):WrappedString
  •   
  • genericArrayOps [T](xs:Array [T]):ArrayOps [T]
  •   

在我看来,Implicits对象内部隐式类名可以使用以下内容:

  
      
  • xOps
  •   
  • RichX
  •   
  • WrappedX
  •   
  • ASX
  •   

您可以选择适合您项目条件的任何一种。

答案 1 :(得分:3)

不,没有真正的既定惯例。 @ srgfed01列出了一些方法(我在野外看到的其他约定:X中的ImplicitX而不是Implicits的隐式转换,以及PimpedX的隐式转换包装X)的类,但你会在现有的scala库中看到所有这些以及更多 - 有时在同一个库中有多个不同的约定。没有像隐式转换x2y样式那样完善,也许是因为隐式类是一个相对较新的特性。

因此,选择您喜欢的样式,并准备好在您使用的库中查找许多不同约定下的含义。

答案 2 :(得分:1)

标准的lib有StringOps

邮件列表上的某个人将我转向了“荒谬描述性的反引号标识符”,以避免命名冲突之间的冲突。

OTOH,也许你想让客户通过阴影来关闭隐含的东西。