文字列値と int 値 (それぞれコマンド出力と終了コード) を公開するクラスがあります。to_s
andを介してそれらを公開することに加えて、次のようにandto_i
も使用しています。to_str
to_int
class Status
def to_s
@output
end
alias :to_str :to_s
def to_i
@status.exitstatus
end
alias :to_int :to_i
end
この背後にある私の考えは、このオブジェクトをできるだけ多くの状況で使用できるようにすることです。文字列または整数に強制可能にすると、その使いやすさが向上します。たとえば、オブジェクトを文字列と連結できます。
a_string = "Output was: " + results
(これを int 強制の例として使用したかったのですが、Fixnum.+ が気に入らないため、実際には機能しません:)
an_int = 1 + results
私がこれまでに読んだものはすべて、これはおそらく「悪い」ことだと言っています。共通のテーマは次のようになりto_s
ます。to_i
to_str
to_int
私のクラスが「基本的に」文字列でも整数でもないことは間違いありません。ただし、このルールにはいくつかの問題があります。
- クラスの柔軟性/使いやすさが低下します。例: Status.to_str がなければ、String.+ を使用して Status 出力を他の文字列と連結することはできませんでした。
- ダックタイピングの精神に反しているようです。オブジェクトのユーザー (つまり、パラメータとしてそれを取得するメソッド) は、そのオブジェクトが何であるかを気にするべきではなく、何ができるかだけを気にする必要があります。(この場合、"do" は "string/int として表現できる" という意味です。)
- 「基本的には文字列/整数です」という議論は、私にはかなりあいまいです。たとえば、それ
Float.to_int
がよく言及されていることがわかります。話は、浮動小数点数には常に整数コンポーネントto_int
があるため、有効な方法であるということです。ただし、これは間違っていると思います: Float は整数ではありません(整数以外のコンポーネントがあるため)。Float を (切り捨てにより) 整数に合法的に変換できますが、(終了コード以外のすべての情報を「切り捨てる」ことにより) Status も整数に変換できると言えます。
だから、私の質問は次のとおりです。実装に実際の(つまり、実際的な)害to_str
はありto_int
ますか?
更新: Jörg W Mittag は、私に何かを考えさせた例を示しました。質問を言い換えると、既に/を持っているのに、本当にto_str
/を持つ必要があるのでしょうか? (特定のメソッドがすでに以上を期待しているという事実に加えて)to_int
to_s
to_i
to_str
to_s
たとえば、Jörg の Array.join の例では、配列メンバーは to_s を介して変換され、セパレータは to_str を介して変換されます。しかし、これは本当に必要ですか?代わりに Array.join がseparator.to_s を呼び出すと、より多くのオブジェクト (例: 整数、シンボルなど) を正常に渡すことができ、より多くの柔軟性を得ることができます。Ruby は、この分離によってメリットがありますか?