아래 f
기능 중 하나를 사용하여 "I 'm not partial"을 인쇄하는 방법 과 아래 코드가 "I 'm partial"을 인쇄하는 이유는 무엇입니까? 그리고 스칼라에서 부분 함수와 이름 오버로딩을 생성하는 함수 (아마도 arity 0)와 연결된 몇 가지 일반적인 규칙이 있습니까?
object T1 extends App{
case class C()
def f: PartialFunction[C, Unit] = { case c:C ⇒ println( "I'm partial") }
def f(c: C): Unit = { println("I'm not partial") }
(f:C ⇒ Unit)(C()) // Why this is printing "I'm partial"?
}
표현은 응용 프로그램이 아닙니다. x의 정의를 모호한 호출과 비교하십시오.
scala> :pa
// Entering paste mode (ctrl-D to finish)
object T1 extends App{
case class C()
def f: PartialFunction[C, Unit] = { case c:C ⇒ println( "I'm partial") }
def f(c: C): Unit = { println("I'm not partial") }
(f:C ⇒ Unit)(C()) // Why this is printing "I'm partial"?
}
// Exiting paste mode, now interpreting.
defined object T1
scala> T1 main null
I'm partial
scala> import T1._
import T1._
scala> val x: C => Unit = f
x: T1.C => Unit = <function1>
scala> f(C())
<console>:12: error: ambiguous reference to overloaded definition,
both method f in object T1 of type (c: T1.C)Unit
and method f in object T1 of type => PartialFunction[T1.C,Unit]
match argument types (T1.C)
f(C())
^
scala> x(C())
I'm partial
사양에 따르면 (글 머리 기호 3) f
만큼 구체적 f(...)
이지만 그 반대는 아닙니다 (글 머리 기호 1).
응용 프로그램의 괄호는 다음과 같은 두 가지를 비교하고 있음을 의미합니다 f(...)
.
도움이되는 경우 다음과 같은 일반적인 방법으로 우선 순위를 지정합니다.
scala> trait Helper { def f: PartialFunction[C, Unit] = { case c:C ⇒ println( "I'm partial") } }
defined trait Helper
scala> :pa
// Entering paste mode (ctrl-D to finish)
object T extends Helper {
def f(c: C): Unit = { println("I'm not partial") }
}
// Exiting paste mode, now interpreting.
defined object T
scala> T f new C
I'm not partial
작성할 수는 있지만 정상적인 방식으로 호출 할 수없는 다른 API가 있습니다.
scala> trait X { def f(i: => Int) = i }
defined trait X
scala> trait Y { def f(i: Int) = 2 * i }
defined trait Y
scala> class Z extends X with Y
defined class Z
scala> new Z().f(42)
res5: Int = 84
scala> typeOf[Z].members filter (_.name.toString == "f")
res7: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(method f, method f)
scala> (new Z(): X).f(42)
res8: Int = 42
또는 여기에서 다른 함수를 호출 할 방법이 없습니다.
scala> class YY extends Y { def f(i: => Int) = i }
defined class YY
scala> new YY().f(42)
<console>:20: error: ambiguous reference to overloaded definition,
both method f in class YY of type (i: => Int)Int
and method f in trait Y of type (i: Int)Int
match argument types (Int)
new YY().f(42)
^
scala> (new YY(): Y).f(42)
res15: Int = 84
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다