3

複数の戻り値の1つだけを返すより良い方法はありますか?

func makeRune(s string) (r rune) {
    r, _ = utf8.DecodeRuneInString(s)
    return
}
4

1 に答える 1

7

はい。これを行う理由についてコメントを追加する必要があります。これを行う動機はしばしば誤った方向に導かれるため、OPへのコメントにあるように、人々はそれを疑問視します。戻り値を投げる関数を書く正当な理由がある場合は、コメントでそれを正当化してください。おそらくあなたは書くことができます、

// makeRune helper function allows function chaining.
func makeRune(s string) (r rune) {
    // toss length return value.  for all use cases in this program
    // only the first rune needs to be decoded.
    r, _ = utf8.DecodeRuneInString(s)
    return
}

これは、「コメントとコードが一致しない場合は、両方とも間違っている可能性があります」という経験則に従うことで、コードレビューにも役立ちます。関数の連鎖が必要ない場合、関数の全体的な目的は疑わしいです。あなたのコメントがあなたがエラー値を投げていると思ったことを示唆しているなら、それは危険信号でしょう。コメントで、sに含めることができるルーンは1つだけだと思われる場合は、それも危険信号になります。上記のコメントの例を考えると、私が書いたものを読んで、関数の名前をfirstRuneにするほうがよいと判断するかもしれません。これはより具体的な意味を持ち、Gomake関数と同様のセマンティクスを提案することを回避します。

于 2012-11-17T15:21:46.977 に答える