0

我正在尝试做:

MyObject.myMethod(_:MyType.myAttribute)

这失败了

type myAttribute is not a member of object MyObject

哪个是对的。问题是我想调用myMethodmyAttribute,而_:MyType不是归于。我可以以某种方式对类型归属进行分组吗?返回 type ,这不是我想要的。MyType:myAttribute__:MyType(_:MyType).myAttributeMyType => classOf(myAttribute)

编辑:我更改了这篇文章的标题和文本,不再将其称为点的关联性,我认为这是不正确的。

4

3 回答 3

2

您是否尝试(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)
                                  ^
于 2012-12-12T04:39:05.683 回答
1

我不确定这是否说明或回答了您的问题,但这是真的。

我的猜测是,您希望您的 ab(_.i) 在添加属性(键入参数)后成为匿名函数。

但是 subexpr 通过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))
于 2012-12-12T04:34:48.417 回答
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)在 Int 上添加 myMethod。例如,您可以添加类似def wrap: MyAttributeto 的MyAttribute内容,并使用类似(_: Int).wrap.method1.method2.method3.result.abs的内容。

于 2012-12-12T01:46:35.447 回答