Scalaä¸ç”¨`=>排除éšå¼å¯¼å‡º_` sytnax

时间:2017-11-29 08:40:42

标签: scala importerror implicit

æ ¹æ®this questionå’Œscala语言规范,å¯ä»¥ä½¿ç”¨ä»¥ä¸‹è¯­æ³•æŽ’除导入: import java.{xxx => _, _}。

然而,我å‘现这并ä¸é€‚用于暗示。例如:

Welcome to Scala 2.12.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101).
Type in expressions for evaluation. Or try :help.

scala> import schema.Encoder.{ofGeneric => _, _}
import schema.Encoder.{ofGeneric=>_, _}

æ ¹æ®è§„范,该æˆå‘˜æ— æ³•è®¿é—®ï¼š

scala> ofGeneric
<console>:15: error: not found: value ofGeneric
       ofGeneric
       ^

但是,处于éšå¼èŒƒå›´ï¼Œæˆ‘å¯ä»¥éšå¼è®¿é—®å®ƒï¼š

scala> :implicits
/* 10 implicit members imported from schema.Encoder */
  /* 10 defined in schema.Encoder */
  implicit val ofBoolean: Boolean]
  implicit def ofConcreteElem[K <: Symbol, A](implicit witness: shapeless.Witness.Aux[K],i
mplicit E: A]): shapeless.labelled.FieldType[K,A]]
  implicit val ofDateTime: java.time.OffsetDateTime]
  implicit val ofDouble: Double]
  implicit def ofElem[K <: Symbol, A, C[_]](implicit witness: shapeless.Witness.Aux[K],imp
licit E: shapeless.Lazy[A]],implicit C: cats.Foldable[C]): shapeless.labelled.FieldType[K,
C[A]]]
  implicit def ofGeneric[A, L <: shapeless.HList](implicit G: shapeless.LabelledGeneric.Au
x[A,L],implicit HE: shapeless.Lazy[L]]): A]
  implicit def ofHListSeq[K <: Symbol, H, T <: shapeless.HList](implicit witness: shapeles
s.Witness.Aux[K],implicit HE: shapeless.Lazy[shapeless.labelled.FieldType[K,H]]],implicit
TE: shapeless.Lazy[T]]): shapeless.labelled.FieldType[K,H] :: T]
  implicit val ofHNil: shapeless.HNil]
  implicit val ofInt: Int]
  implicit def ofString: String]

scala> implicitly[schema.Encoder[Tuple2[Int,String]]]
res3: schema.Encoder[(Int, String)] = schema.Encoder$$anonfun$ofGeneric$2@341619cc
                                                              ^^^^^^^^^

问题:

  1. 这是控制å°ä¸­çš„错误还是语言功能?
  2. 有没有办法绕过这个(å³å¯¼å…¥é™¤ä¸€ä¸ªä¹‹å¤–的所有éšå¼æˆå‘˜ï¼‰ï¼Œè€Œä¸å•ç‹¬æŒ‡å®šæ¯ä¸ªå‡½æ•°ï¼Ÿ

2 个答案:

答案 0 :(得分:1)

æ¥è‡ªè§„范:

  

有资格传递给éšå¼çš„实际å‚æ•°   TT类型的å‚数分为两类。首先,符åˆæ¡ä»¶çš„是全部   标识符xx,å¯ä»¥åœ¨æ–¹æ³•è°ƒç”¨ç‚¹è®¿é—®   ...... 如果没有   此规则下的符åˆæ¡ä»¶çš„标识符,然åŽæ˜¯ç¬¬äºŒä¸ªç¬¦åˆæ¡ä»¶çš„标识符   属于éšå¼èŒƒå›´çš„æŸä¸ªå¯¹è±¡çš„所有éšå¼æˆå‘˜   éšå¼å‚数的类型,TT。

     

TT类型的éšå¼èŒƒå›´åŒ…括所有的伴éšæ¨¡å—   与éšå¼å‚数类型相关è”的类。

所以,这就是说,一旦å°è¯•æŸ¥çœ‹æœ¬åœ°èŒƒå›´ï¼Œå®ƒä¼šåœ¨ä¼´éšå¯¹è±¡ä¸­å¯»æ‰¾éšå«ã€‚

确实å¯ä»¥é€šè¿‡è°ƒç”¨ä¸Šé¢çš„implicitly[...]表达å¼è€Œä¸é¦–先导入任何æ¥çœ‹åˆ°è¿™ä¸€ç‚¹;它åªæ˜¯èµ·ä½œç”¨ï¼Œå› ä¸ºè¿™äº›æ–¹æ³•æ˜¯ä¼´ä¾£çš„一部分。

æ ¹æ®ä¸Šé¢çš„引用,这应该æ„味ç€å¦‚果我创建和/或导入一个éšå«åˆ°ä¸Žä¼´éšå¯¹è±¡ä¸­å…·æœ‰ç›¸åŒç­¾å的范围,它们将优先,从而消除了“排除éšå¼å¯¼å‡ºâ€çš„需è¦'å°±åƒæˆ‘原æ¥çš„问题一样。

答案 1 :(得分:0)

ä¸ç¡®å®šç¬¬ä¸€ä¸ªé—®é¢˜ï¼Œä½†è§£å†³æ–¹æ³•æ˜¯åœ¨èŒƒå›´å†…定义一个具有相åŒå称的éžéšå¼æˆå‘˜ã€‚