全てがオブジェクトってどういうこと?
Rubyでは全てがオブジェクトですが、これは実際のところどういうことなのでしょうか。
文字通りの意味なのですが、primitiveとの違いを考えるとわかりやすいと思います。
RubyではstringはString Class
のインスタンスですが、javascriptではprimitive value
です。
これはどういうことかというと、Rubyのstringはオブジェクトであるため変更可能(mutable)ですが、javascriptにおけるstringはprimitive valueであるため変更不可能(immutable)であるということです。
- ruby
str = "hola"
str[0] = "c"
# str => "cola"
- javascript
let str = 'hola'
str[0] = 'c'
console.log(str)
// => Uncaught TypeError: Cannot assign to read only property '0' of string 'hola'
↑ javascriptではprimitive value
を変更しようとするとキレられます。
同じ文字列であったとしても別のインスタンスが生成されます。
"hello".object_id # => 10260
"hello".object_id # => 27900
==
では、内容を比較して判定します(同値性)。なのでobject_id
が違ったとしても内容が同じであればtrue
を返します。
object_id
を基準に判定するのはequal?
メソッドです。
mutableであることを意識しておかなければ、バグらせてしまう可能性があります。
下記のように意図しない変更が生じてしまうことがあるので注意が必要です。
a = "hola"
b = a
b[0] = "c"
puts a # => "cola"
メソッドさえもオブジェクトです。
"hello".class.instance_method(:size).class
# => UnboundMethod
UnboundMethod Classのインスタンスであることがわかります。
終わりに
これを理解することができたのは、おそらくjavascriptについての知識がついたからです。
異なるパラダイムを持つ言語を学ぶことは、すごい意味のあることだと思いました。