Принудительная группировка начертания на подчеркивании в скале

Я пытаюсь сделать:

MyObject.myMethod(_:MyType.myAttribute)

Это не с

type myAttribute is not a member of object MyObject

что правильно. Проблема в том, что я хочу позвонить myMethod на myAttribute из _:MyTypeне приписывай MyType:myAttribute в _, Можно ли как-то сгруппировать тип надписи _:MyType? (_:MyType).myAttribute возвращает тип MyType => classOf(myAttribute)что не то, что я хочу.

Редактировать: я изменил название и текст этого поста, чтобы больше не называть это ассоциативностью точки, что я считаю неправильным.

3 ответа

Решение

Вы пытаетесь создать функцию (m: MyType) => MyObject.myMethod(m.myAttribute) используя подчеркивание?

Если так, то проблема в том, что MyObject.myMethod((_:MyType).myAttribute) средства MyObject.myMethod((m:MyType) => m.myAttribute),

Вы можете использовать инфиксную нотацию:

MyObject myMethod (_:MyType).myAttribute

Доказательство того, что это работает:

scala> case class MyType(myAttribute: Int)
defined class MyType

scala> object MyObject {
     |   def myMethod(a: Int) = a.toString
     | }
defined module MyObject

scala> MyObject myMethod (_:MyType).myAttribute
res0: MyType => java.lang.String = <function1>

scala> res0(MyType(1))
res1: java.lang.String = 1

scala> MyObject myMethod (MyType(1))
<console>:1: error: type mismatch;
 found   : MyType
 required: Int
              MyObject myMethod (_:MyType)
                                  ^

Я не уверен, иллюстрирует ли это или отвечает на ваш вопрос, но это правда.

Я предполагаю, что вы ожидали, что ваш ab(_. I) будет анон-функцией после добавления надписи (для ввода параметра).

Но субэкспресс мешает вам there is no other expression of syntactic category Expr which is properly contained in e and which itself properly contains u. (SLS 6.23)

Также вы можете использовать scalac -Xprint:parser чтобы увидеть, как это принято.

object Foo {
  def m(k: Int) = 7 * k
}
class Bar {
  val i = 5
  val What = i
}
object Bar {
  type What = Int
}

object Test extends App {
  Foo.m(_:Bar.What)
  // this is not anon func placeholder syntax...
  //Foo.m((_:Bar).What)  // _ is in a subexpr
  //Foo.m(_.i)
  // ...for this
  val f = (x: Bar) => Foo.m(x.i)
  // InfixExpr is ok
  val g = Foo m (_: Bar).i
  val b = new Bar
  println(f(b))
  println(g(b))
}

Контраст, чтобы проиллюстрировать, что ограничивается:

scala> val f: (Int,Int)=>Int = _+_
f: (Int, Int) => Int = <function2>

scala> val g: Int=>Int = if (_ > 0) 1 else 2
<console>:7: error: missing parameter type for expanded function ((x$1) => x$1.$greater(0))
List(1,2,3).map((i: Int) => i * i)

РЕДАКТИРОВАТЬ

List(1,2,3).map((_: Int).unary_-)

РЕДАКТИРОВАТЬ 2

implicit class MyAttribute(i: Int) { def myMethod() = i * i }
List(1,2,3).map((_: Int).myMethod.unary_-)

объяснение

Я использовал неявный класс (Scala-2.10), чтобы добавить myMethod в Int, после того, как унарная операция "-" была выполнена с результатом. Вы можете добавить что-то вроде def wrap: MyAttribute в MyAttributeи использовать его как (_: Int).wrap.method1.method2.method3.result.abs, например.

Другие вопросы по тегам