Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyシンボルとは何ですか?どのように機能しますか?

記号は次のようになります:

:testing

シンボルと変数を混同する人もいますが、変数とは何の関係もありません…

記号は文字列によく似ています

では、Rubyの記号と文字列の違いは何ですか?

文字列は、データを操作するために使用されます 。

記号は識別子です 。

それが主な違いです:

記号は単なる文字列ではなく、目的も異なります。

記号を使用する場合

シンボルの最も一般的な使用法の1つは、メソッドとインスタンスの変数名を表すことです。 。

attr_reader :title

:title attr_readerの後は、@titleを表す記号です。 インスタンス変数。

シンボルをハッシュキーとして使用することもできます。

hash = {a: 1, b: 2, c: 3}

メリットは?

記号は見栄えが良く、不変です。文字列キーと記号キーのベンチマークを行うと、文字列キーの速度が約1.70倍遅くなることがわかります。

不変とは、すべてのシンボルが一意であることを意味します 、変更できません:

:rubyguides.object_id
# 437768

:rubyguides.object_id
# 437768

これらの2つのシンボルは同じオブジェクトです 同じオブジェクトIDを持っているからです。

シンボルは、sendなどのメタプログラミングメソッドで使用できます。 :

[1,2,3].send(:first)

まとめ

名前として記号を使用する必要があります または、物事のラベル(メソッドなど)を使用し、データを重視する場合は文字列を使用します (個々のキャラクター)。

文字列と記号間の変換

必要に応じて、記号を文字列に変換できます。

なぜあなたはそれをしたいのですか?

シンボルには、文字列が持つメソッドのサブセットしか含まれていないためです。

また、記号は変更できないため、記号の個々の文字を操作する場合は、文字列が必要です。

これは、to_sを使用して行うことができます メソッド。

たとえば、method_missingを使用する場合 欠落しているメソッドの名前をシンボルとして取得します。このメソッド名が特定のパターン(?で終わるなど)に一致するかどうかを確認することをお勧めします 。

def method_missing(method_name, *args, &block)
  if method_name.to_s[-1] == "?"
    # do something
  else
    super
  end
end

文字列オブジェクトをシンボルオブジェクトに変換することもできます。

これを行う方法は、String#to_symです。 :

"rubyguides".to_sym

:rubyguides

シンボルの配列の作成

シンボルの配列を作成する場合は、次のコードを使用できます:

symbols = %i(a b c)

[:a, :b, :c]

これにより、コロンとカンマを入力する必要がなくなります。

文字列バージョン%wに似ています :

strings = %w(a b c)

["a", "b", "c"]

ルビーシンボルビデオ

シンボルGC(詳細)

シンボルに関するもう1つの興味深い事実は、さまざまなタイプがあることです。

その理由は、シンボルがRuby 2.2より前にガベージコレクションされなかったためです。つまり、通常のRubyオブジェクト(文字列、ハッシュ、配列など)のように、シンボルが不要になったときにメモリからクリーンアップされませんでした。

ここで例を見ることができます

p Symbol.all_symbols.size
# 2443

('aa'..'aj').map(&:to_sym)

GC.start
p Symbol.all_symbols.size
# 2453

10個の新しいシンボルを作成しているので、予想どおり、シンボルの総数が10個増えることに気付くでしょう。

ただし、Ruby 2.2以降、これらのシンボルは一時的なものであり、このコード内の他の何かによって使用されていないため、メモリから削除されます。

シンボルGCが有効になっているバージョンのRubyでこのコードを試すと、両方のシンボルカウントが同じになります。

一部のシンボルはメモリから削除されません。これらは「不滅のシンボル」と呼ばれます。

ObjectSpaceモジュールを使用してそれらを数えることができます:

require 'objspace'

ObjectSpace.count_symbols

{
  :mortal_dynamic_symbol=>3,
  :immortal_dynamic_symbol=>5,
  :immortal_static_symbol=>3663,
  :immortal_symbol=>3668
}

:a1のように直接作成されたシンボルに注意してください 自動的に不滅のシンボルになります。新しいメソッドを作成すると、immortal_static_symbolも作成されます それに合わせて。

では、人間のシンボルはどこから来るのでしょうか?

to_symで記号に変換された文字列から メソッド。

これは、ObjectSpace.count_symbolsを使用して自分で確認できます。 。

そして、immortal_dynamic_symbolとは何か疑問に思っているなら、 、それは不滅から不滅へと昇進したシンボルです。これは、人間のシンボルの名前でメソッドを作成するときに発生する可能性があります。

概要

この記事であなたは学びました:

  • シンボルは不変です
  • 記号は値へのポインタではなく、値そのものです
  • 文字列はデータ用、記号はID用です
  • 文字列と記号を変換する方法
  • Symbol GCは、一時的なシンボルをクリーンアップするためにRuby2.2で導入されました

あなたが何か新しいことを学んだことを願っています!

より多くの人にリーチできるように、この投稿を共有してください🙂


  1. Ruby 2.6のMJITとは何ですか?どのように機能しますか?

    Rubyのパフォーマンスはバージョンごとに大幅に向上しており、Ruby開発チームはRubyをさらに高速化するためにあらゆる努力をしています! これらの取り組みの1つは、3×3プロジェクトです。 目標は? Ruby3.0はRuby2.0の3倍高速になります 。 このプロジェクトの一部は、この記事のトピックである新しいMJITコンパイラです。 MJITの説明 MJITは「メソッドベースのジャストインタイムコンパイラ」の略です。 それはどういう意味ですか? RubyはコードをYARV命令にコンパイルします 、これらの命令はRuby仮想マシンによって実行されます。 JITはこれに別のレ

  2. Windows Sysinternals:その概要と使用方法

    Windows コンピューターを完全に制御したいと思ったことはありませんか?ほぼすべての Windows プロセスまたはアプリケーションの内部を確認できるだけでなく、アプリケーションがアクセスしているファイルやレジストリ エントリをリアルタイムで表示できるというのは素晴らしいことです。 最も評判が良く強力な Windows システムおよび管理ツールキットの 1 つは Sysinternals です。ほとんどのユーティリティは単純な EXE ファイルであり、USB フラッシュ ドライブに配置することで、システム管理用の Windows ポータブル アプリのコレクションに追加できます。 Wind