1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

全てがオブジェクトってどういうこと?

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についての知識がついたからです。
異なるパラダイムを持つ言語を学ぶことは、すごい意味のあることだと思いました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?