Принудительная группировка начертания на подчеркивании в скале
Я пытаюсь сделать:
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
, например.