当前位置: 首页 > 知识库问答 >
问题:

Scala参与者:返回一个不同于任何类型的未来。

贾骏喆
2023-03-14

我正在努力读完一本关于Scala Actor的书,我遇到了一点语法问题。在实践中,我倾向于这样分配我的变量和函数定义:

val v: String = "blahblahblah"
def f(n: Int): Int = n+1

在项目名称后包含项目的(返回)类型。虽然我知道这不是必需的,但我已经习惯了这种约定,并发现它使代码更容易被我自己理解。尽管如此,请观察以下示例:

class Server extends Actor {
  def act() = {
    while (true) {
      receive {
        case Message(string) => reply("Good,very good.")
      }
    }
  }
}
def sendMsg(m: Message, s: Server): Future[String] = {
  s !! m
}

上面的代码在编译时产生一个错误,抱怨服务器返回了Future[Any],而不是Future[String]。我理解,通过从sendMsg中删除返回类型可以避免此问题:

def sendMsg(m: Message,s: Server) = s !! m

然而,这不符合我的风格。有没有一种方法可以指定服务器生成的Future的类型(相对于Future[任何])?

共有1个答案

蒋原
2023-03-14

您的问题远不止是样式:您会得到一个未来[Any],因为编译器无法静态地更好地了解当前的Akka参与者以及现在已弃用的scala。演员。在没有编译时检查的情况下,您需要求助于运行时检查,正如idonnie已经评论的那样:

(actorRef ? m).mapTo[String]

这将把另一个Future链接到原始的Future,该Future填充了一个String结果,如果演员很淘气,则填充了一个ClassCastExc0019,如果演员没有回复,则填充了一个TimeoutExc0019,请参阅Akka文档。

可能很快就会有出路,我正在开发一个Akka扩展,以包括静态类型的通道,但这将导致您不得不以稍微不同的方式编写代码,使用更多的类型注释。

 类似资料:
  • 我正在寻找一种将long或long转换为从Number派生的类型的方法: 问题在于方法。当前代码不起作用。如何从中获取,它是一个?当然有一个简单的方法可以做到这一点。。。

  • 我想使返回数据类型的的函数与传入的参数的数据类型相同。例如,我会这样调用函数: 因为我将一个传递给,所以它返回了一个

  • 问题内容: 在Java中,要使函数返回一个与参数类型相同的对象并扩展某个类,我将输入: 是否有与此等效的C ++? 换句话说,我如何使一个函数接受任何扩展了某个类并返回相同类型的类?(这是为了抽象/纯虚拟类的目的)。 问题答案: 如果您有C ++ 11或更高版本,我们可以在这里使用 例如: 现场演示

  • 为了理解TypeScript的精神,我在我的组件和服务中编写了全类型签名,这扩展到了angular2表单的自定义验证函数。 我知道我可以重载函数签名,但这需要每个返回类型的参数不同,因为将每个签名编译为单独的函数: 我还知道我可以返回单个类型(如Promise),它本身可以是多个子类型: 但是,在angular2自定义表单验证器的上下文中,单个签名(一个类型为的参数)可以返回两种不同的类型:带有表

  • 我有一个这样的方法,它通常用于返回。 在最后一行,我从Pylance那里得到了以下信息: (方法)is_file:()- 有没有一种方法可以正确地键入提示这种情况,以便Pylance知道是?或者我应该让它总是返回路径,并有另一个方法调用将输出转换为字符串,然后返回? 谢谢 编辑1 我刚刚意识到另一个更常见的场景: 在熊猫中,输入参数可以改变输出类型,Pylance也不能处理这个问题。Pylance

  • 我试着写一个小函数,它接受两个列表,并根据另一个列表的元素对一个进行排序。所以类似于: 将产生一个排序列表。 然而,可能是一个不同的列表,比如整数、浮点数或其他列表。理想情况下,我希望我的程序能够获取我抛出的任何列表,根据