4

Rubyではすべてがオブジェクトです。しかし、数値に対してシングルトンメソッドを試すと、型エラーが発生します。すべてがオブジェクトであるという概念に例外はありますか?

a_str = "Ruby"
a_num = 100

def a_str.bark
  puts "miaow"
end

a_str.bark #=> miaow (Good Cat!)

def a_num.bark
  puts "miaow"
end

a_num.bark #=> TypeError: can't define singleton method "bark" for Fixnum
4

1 に答える 1

4

数字は、実際にはメモリ内の実際のオブジェクトとして存在しないため、一種の特別なものです。それらの数は無限にあるため、これは実行不可能です。

代わりに、Rubyは特定の規則を使用してそれらをオブジェクトとしてエミュレートします。つまりobject_id、aのFixnumは常に2 * i + 1i数である)であることに気付くでしょう。この規則を使用すると、Rubyは、パフォーマンスとスペースの制約のためにCPU上で実際のプレーンな数値として表される数値をエミュレートして、Rubyプログラムのオブジェクトのように見せることができます。

sは実際にはメモリ内に個別のオブジェクトとしてFixnum存在しないため、個別に変更することはできません。代わりに、数値は不変と見なされます。これらは主にオブジェクトとして使用できますが、実際の個別のオブジェクトではないため、変更することはできません。Rubyには、他にもいくつかの不変オブジェクトがあります。たとえばfalse、、、。truenil

比較すると、文字列は、変更可能で不変ではない個別のルビーオブジェクトとして処理されます。したがって、これは、遭遇する他のすべてのRubyオブジェクトの大部分と同じように動作します。

于 2013-03-21T12:02:47.800 に答える