在Akka中使用管道模式时,将来失败的结果将包含在akka.actor.status.Failure中,但未来的成功结果不会包含在相应的akka.actor.status.Success中.
我想知道这个决定背后的原因是什么?为什么只是失败而不是成功?
没有包装任何东西似乎更合乎逻辑.
以下是实施的链接:https: //github.com/akka/akka/blob/v2.4-M2/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala
我有一个名为Expect的类,在您实例化之后,您可以构建一个数据结构(为简单起见,可以说它是一棵树).然后调用遍历树的run方法,在每个节点上执行某些操作.这些操作需要一些时间才能完成,因此将来会返回最终结果.在伪代码中它将是这样的:
class Expect[R](command: String) {
//some methods to build the tree
def run()(implicit ec: ExecutionContext): Future[R] = {
//Traverse the tree and execute actions on the nodes that eventually return a R
}
}
Run Code Online (Sandbox Code Playgroud)
我想用他们常用的签名来实现map和flatmap,但是他们作为参数接收的函数必须在将来返回的值上运行.我看不出任何实现这一点的方法.
def map[T](f: R => T): Expect[T]
def flatMap[T](f: R => Expect[T]): Expect[T]
Run Code Online (Sandbox Code Playgroud) 给出以下代码:
class Foo[R](i: Int)(implicit ev: Ordering[R]) {
final type T = ev.type
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误:(13,16)私有值ev逃脱其定义范围,作为类型Foo.this.ev.type类型T = ev.type的一部分
这让我觉得构造函数中声明的含义是私有的.鉴于这T是最终的,它不会被覆盖,所以它不应该导致任何问题.我在这里错过了什么?
在Dotty 中给出以下内容:
object Domain {
final case class Create(name: String) extends BaseCreate[Create] {
override type Model = Domain
override def service[F[_]](client: KeystoneClient[F]): CrudService[F, Domain, Create] = client.domains
}
}
case class Domain(id: String)
class CrudService[F[_], Model, Create]
final class Domains[F[_]] extends CrudService[F, Domain, Domain.Create]
class KeystoneClient[F[_]] {
val domains = new Domains[F]
}
trait BaseCreate[Create <: BaseCreate[Create]] {
type Model
def service[F[_]](client: KeystoneClient[F]): CrudService[F, Model, Create]
}
Run Code Online (Sandbox Code Playgroud)
我想“简化” BaseCreate,以便我可以这样实现Create:
final case class Create(name: String) extends …Run Code Online (Sandbox Code Playgroud) 我正在为 kadmin 命令实现一个库。除其他外,还可以使用以下方法:
def changePassword(principal: String, newPassword: String): Either[ErrorCase, Boolean]
def deletePrincipal(principal: String): Either[ErrorCase, Boolean]
Run Code Online (Sandbox Code Playgroud)
这两个操作可能会返回错误,因此它们的返回类型为Either[ErrorCase, Boolean]. 其中ErrorCase定义为:
trait ErrorCase
case object InsufficientPermissions extends ErrorCase
case object PrincipalDoesNotExist extends ErrorCase
case object IncorrectPassword extends ErrorCase
case object PasswordTooShort extends ErrorCase
case object PasswordWithoutEnoughCharacterClasses extends ErrorCase
case object PasswordIsBeingReused extends ErrorCase
case object PasswordExpired extends ErrorCase
case object UnknownError extends ErrorCase
Run Code Online (Sandbox Code Playgroud)
ErrorCase我的问题是:如果我将特征 ErrorCase 定义为密封特征,那么当 API 用户调用其中一个 API 方法时,我会给 API 用户检查所有可能的 s 带来负担。这对于该方法来说是有意义的 changePassword,因为所有这些错误情况都可能在此操作中发生。但对于该deletePrincipal方法来说,这是没有意义的,因为所有与密码相关的错误情况都不会发生。换句话说,API …