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で導入されました
あなたが何か新しいことを学んだことを願っています!
より多くの人にリーチできるように、この投稿を共有してください🙂
-
Ruby 2.6のMJITとは何ですか?どのように機能しますか?
Rubyのパフォーマンスはバージョンごとに大幅に向上しており、Ruby開発チームはRubyをさらに高速化するためにあらゆる努力をしています! これらの取り組みの1つは、3×3プロジェクトです。 目標は? Ruby3.0はRuby2.0の3倍高速になります 。 このプロジェクトの一部は、この記事のトピックである新しいMJITコンパイラです。 MJITの説明 MJITは「メソッドベースのジャストインタイムコンパイラ」の略です。 それはどういう意味ですか? RubyはコードをYARV命令にコンパイルします 、これらの命令はRuby仮想マシンによって実行されます。 JITはこれに別のレ
-
Windows Sysinternals:その概要と使用方法
Windows コンピューターを完全に制御したいと思ったことはありませんか?ほぼすべての Windows プロセスまたはアプリケーションの内部を確認できるだけでなく、アプリケーションがアクセスしているファイルやレジストリ エントリをリアルタイムで表示できるというのは素晴らしいことです。 最も評判が良く強力な Windows システムおよび管理ツールキットの 1 つは Sysinternals です。ほとんどのユーティリティは単純な EXE ファイルであり、USB フラッシュ ドライブに配置することで、システム管理用の Windows ポータブル アプリのコレクションに追加できます。 Wind