0

私がやろうとしていること:

MyObject.myMethod(_:MyType.myAttribute)

これは失敗します

type myAttribute is not a member of object MyObject

どちらが正しい。問題は、に帰するのではなく、myMethodmyAttributeを呼びたいということです。どういうわけかタイプアクリプションをグループ化できますか?タイプを返しますが、これは私が望むものではありません。_:MyTypeMyType: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) が anon func であると予想したと思います。

しかし、部分式はあなたを失敗させます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: MyAttributeMyAttribute使用でき(_: Int).wrap.method1.method2.method3.result.absます。

于 2012-12-12T01:46:35.447 に答える