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

一种可能性是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 回答