【问题标题】:scala - make variable available inside blockscala - 使变量在块内可用
【发布时间】:2015-02-13 00:41:42
【问题描述】:

有一个这样使用的函数:

xpto.withClient {
  client => client.abcd
}

我想把它包装在一个对象中:

object X {
  def foo[T](block: => T): T = {
    xpto.withClient {
      client => {
        block
      }
    }
  }
}

为了使它可以像这样使用:

object Y {
  def bar : Unit {
    X.foo {
      client.abcd
    }
  }
}

这似乎并没有使客户端值在块内可用。这可能吗?使客户端变量在块定义中可用?我用 Scala 中的隐式环顾四周,但到目前为止还不好。

【问题讨论】:

  • 确实允许这样做,你需要像 Haskell 的隐式参数这样的东西。请注意,这些最终会出现在 Haskell 中的函数类型中,否则类型安全会受到很大影响。

标签: scala


【解决方案1】:

这行不通,因为block 只是产生T 值的东西。它没有相同的范围。假设client 的类型为Client,那么block 应该是一个函数Client => T。然后foo 会将client 传递给block

def foo[T](block: Client => T): T = {
    xpto.withClient { client =>
        block(client)
    }
}

或者更简洁:

def foo[T](block: Client => T): T = xpto.withClient(block(_))

但是,这会将您的用法更改为:

object Y {
  def bar : Unit {
    X.foo { client =>
      client.abcd
    }
  }
}

当然,这只是将xpto.withClient 包裹得很薄。问题是,您需要有一种方法将client 沿链传递。隐式执行此操作也无济于事,因为您仍然需要在该匿名代码块中使用 client 标识符。

【讨论】:

  • 是的,你是对的。我试图避免在 X.foo 中命名客户端,但我想这是不可能的。我了解您的解决方案以及它的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2018-06-08
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多