__TEXT __DATA __OBJC その他の 10 進数とメソッドの違いは何ですか
概要
文字列に対して size と length を実行すると、同じ値が返されました。
"akash".size # => 5
"akash".length # => 5
これら 2 つの方法の違いは何ですか?
解決策
Ruby ではメソッドをオーバーライドできるため、同じ結果をもたらす複数のメソッドが存在するクラスがあり、1 つのメソッドの動作を他のメソッドに影響を与えることなく簡単にオーバーライドできます。一部のクラスは別のメソッドを使用してこれを実行しますが、他のクラスはこの動作をエイリアスとして実装します。
多くの場合、どれがどれで、なぜであるかは言語実装の決定事項であり、コードを実装した Ruby コア チームのメンバーに尋ねることなしに標準的に答えることはできません。したがって、質問のその部分はスタック オーバーフローの範囲外です。エイリアス化されたメソッドには、動作に似たメソッドほど頻繁にモンキー パッチが適用されることは期待されていないと仮定するのは合理的な仮定ですが、それは単なる仮定に過ぎません。
真に標準的な答えが必要な場合は、SVN ソースを調べたり、バグ トラッカーのディスカッションを検索したり、コア チームに直接質問したりする必要があります。ただし、私は以下に実際的な分析を提供します。
たとえば、Ruby の String#size メソッドと String#length メソッドは実際には別のメソッドですが、Ruby は内部的に同じ C ソース コードを呼び出して両方を実装します。
rb_str_length(VALUE str)
{
return LONG2NUM(str_strlen(str, NULL));
}
これは純粋に実装の詳細です。 Ruby VM の観点から見ると、これらは実際には別々のメソッドであり、速度向上のために基盤となる C 実装をたまたま共有しているだけです。 String オブジェクトの #size または #length は両方の動作を変更せずに再定義できるはずですが、再定義すると Pry や IRB などの REPL に干渉することがよくあります。
一方、クラスによっては #size と #length をエイリアスとして実装するものもあります。たとえば、Array#size は Array#length のエイリアスとして明示的に定義されます。結果として、元のメソッド名のコピーが #size として作成されるため、元の #length メソッドの動作を変更せずにエイリアス化されたバージョンを再定義できるはずです。
この問題は実際には動作ではなく実装の違いです。実際には、唯一の意味のある違いは、どの Ruby コンポーネントが同様の動作を実装するかにあるように見えます。従来の理由やパフォーマンス上の理由がある可能性がありますが、単に誰も報告したり修正したりしていないバグである可能性もあります。
この動作は正常であり、最小の驚きの原則に実際には違反していないため、軽微な言語の癖として扱います。ただし、それをより強く感じる人は、間違いなくバグを報告する必要があります。