5

古いさびたPascalには、オブジェクトまたはレコードに対して一連のアクションを実行するための便利な構成がありました。

with obj do
begin
  methodCall
  otherMethodCall
  ...
end

私はscalaで似たようなものに触れようとしていますが、頭の中に何かが欠けています:)

objが現在渡されたクロージャのスコープ内にあり、次のように動作するかのように、何らかの形でそのような効果を達成することは可能ですか?

{
  import obj._
  callObjMethod(x, y)
  objVal.doSomething()
  ...
}

しかし、次のようなカスタマイズされた構文では:

doWith (obj) {
  callObjMethod(x, y)
  objVal.doSomething()
}

no直感的にはそれ以上のものだと感じますがyes、好奇心は確かに知りたがっています。

4

2 に答える 2

12

こういう意味ですか?

val file = new java.io.File(".")

// later as long as file is in scope

{
  import file._
  println(isDirectory)
  println(getCanonicalPath())
}  

キーワードを使用するだけimportで、オブジェクトのメソッドをスコープに含めることができます。

于 2013-03-16T15:06:35.440 に答える
11

1つの可能性はtap方法です:

def tap[A](obj: A)(actions: (A => _)*) = {
  actions.foreach { _(obj) }
  obj
}

tap(obj) (
  _.callObjMethod(x, y),
  _.objVal.doSomething()
)

または濃縮を使用した後

implicit class RichAny[A](val obj: A) extends AnyVal {
  def tap(actions: (A => _)*) = {
    actions.foreach { _(obj) }
    obj
  }
}

obj.tap (
  _.callObjMethod(x, y),
  _.objVal.doSomething()
)

マクロを使用すると、目的の構文を取得できる(そして関数オブジェクトを作成するオーバーヘッドを回避できる)はずだと思いますが、それは他の誰かに任せます。

于 2013-03-16T14:12:12.660 に答える