我对Scala很陌生,我的项目的一部分最终采用了以下设计。
trait StringService {
def length(s: String): Int
def vowels(s: String): Int
}
这些方法用作
的参数def processStrings(operation: String => Int) = {...}
processStrings(ss.length)
之类的通话工作正常。现在我想摘要
这些方法的类型
type StringFuction = String => Int
问题在于像
这样的实现override def length(s: String): Int = { ... }
不再有效。当然,我可以选择
override def length: StringFunction = { (s: String) => ... }
但这似乎有点偏。 什么是正确的方法?如果这不是真正的Scala方法,请随意提出不同的设计。
答案 0 :(得分:0)
嗯,有不同的方法可以执行此操作,具体取决于您要使用类型别名的目的。这适用于例如:
type StringFunction = String => Int
trait Foo { def foo(s: String) = ??? }
class Bar extends Foo {
def foo(s: String) = s.length
}
def foobar(f: StringFunction)(s) = f(s)
foobar(new Bar().foo)("bar")
这也有效:
type StringFunction = String => Int
trait Foo { def foo: StringFunction = ??? }
class Bar extends Foo {
override def foo = _.length
}
def foobar(f: StringFunction)(s) = f(s)
foobar(new Bar().foo)("bar")
严格来说,这些结构并不相同:在第一种情况下,Foo.foo
是一个方法,它接受一个String参数并返回一个Int。
在第二种情况下,它是一个不带参数的方法,并返回一个lambda函数,它接受一个String参数,并返回一个Int。
但这种差异相当微妙。它对某些特定情况很重要,但通常可以忽略不计。