1

次のようなクラスがあります。

trait Foo {
  def greet(name: String) : String
}

trait Bar {
  def hello(name: String) = s"Hello ${name}!"
}

class Greeter extends Foo with Bar {
  def greet(name: String) = hello(name)
}

greetメソッドの部分的な適用を使用して実装できるかどうか興味がありhelloますか? 何かのようなもの:

class Greeter extends Foo with Bar {
  def greet = hello
}

(明らかにこれはうまくいきません)

4

2 に答える 2

2

greet@chrisが指摘したように、確かに実装できますが、そのコードスニペットはオーバーロード Foo.greet(name:String)します。それはそれを上書きしません:

class Greeter extends Foo with Bar {
    def greet = hello _
}

<console>:9: error: class Greeter needs to be abstract, since method
       greet in trait Foo of type (name: String)String is not defined
       class Greeter extends Foo with Bar { def greet = hello _ }

以下はコンパイルされますが:

class Greeter extends Foo with Bar {
    def greet(name: String) = hello(name)
    def greet = hello  _
}

余談ですがgreet、末尾のアンダースコアなしで、明示的な型 decl で定義することもできます。

def greet: String=> String = hello
于 2013-05-04T01:39:59.143 に答える
2

Scala では、メソッドを部分的にのみ適用する場合は、明示的に指定する必要があることがよくあります。これは、メソッド名の後ろにアンダースコアを書くことによって行われます (ただし、その前にスペースを忘れないでください)。あなたの場合、次のように機能します。

def greet = hello _

編集: @Richard Sitze が観察した後、Foo次のように定義をわずかに変更することで状況を修正できます。

trait Foo {
  def greet : String => String
}

もちろん、これが適切かどうかは、特定の設定によって異なります。

于 2013-05-04T01:32:43.960 に答える