Rubyのシンボルとは何ですか?


45

私は、Rubyの世界にはまったく馴染みがなく、Symbolsの概念に少し混乱しています。シンボルと変数の違いは何ですか?なぜ変数を使用しないのですか?

ありがとう。


Lispでは-Rubyの派生元-シンボルは基本的に変数のデータ型です。つまり、プログラムは実行時にReflection風の方法で操作できます。(最も一貫した説明ではありません、申し訳ありません)
ポールネイサン

回答:


70

変数とシンボルは異なります。変数はさまざまな種類のデータを指します。Rubyでは、シンボルは変数というよりも文字列に似ています。

Rubyでは、文字列は可変ですが、シンボルは不変です。つまり、シンボルのコピーを1つだけ作成する必要があります。したがって、あなたが持っている場合

x = :my_str
y = :my_str

:my_str一度だけ作成、され、xかつyメモリの同じ領域をポイントします。一方、持っている場合

x = "my_str"
y = "my_str"

含む文字列がmy_str作成され二回、そしてxy異なるインスタンスを指しています。

その結果、シンボルは多くの場合、Rubyの列挙型に相当するものとして使用されるほか、辞書のキー(ハッシュ)として使用されます。


1
@mipadiのポイントをプッシュするために、文字列を比較するときには、すべての文字を互いに比較する必要があります。したがって、同一の文字列を比較することはO(n)です。一方、ルビー記号はオブジェクト参照を比較しますが、O(1)です。
ジェレミーハイラー

Pythonにこれがないのはなぜですか?
ジョブ

、最後に私が知っていたので、あなたは、また、それら使いすぎないように注意する必要がありますが、私はルビー> 1.9でこのに見ていない、シンボルはgc'dれませんので、メモリまで食べることができる
frogstarr78

これらは、Smalltalkで同じように動作しますが、外観が似てい#mySymbolます。
フランクシェラー

@ frogstarr78-プログラムでシンボルを生成する(最初にチェックせずに文字列をインターンする)場合を除き、多くのシンボルを作成することを心配する必要はありません。
ジャスティンL.

16

Rubyのシンボルは、基本的に実世界のシンボルと同じものです。何かを表現したり、名前を付けるために使用されます。

シンボルは、ある種の状態を表すために非常に一般的に使用されます。たとえば、

order.status = :canceled
order.status = :confirmed

シンボルをインスタント列挙として見ることもできます。シンボルを定義する必要はなく、使用するだけです。この記事では、詳細に説明します。


1
私がこれまでに見たほとんどよりも良い説明。
ユーリジェンセフ16

0

通常、変数は文字列と混同される傾向がありますが、変数のように考えていることは理解できます。理解できます。このように考えてください:

ゲーム内のプレイヤーのステータスは数字で表されます。1は生存、2は不確実、3は死を意味します。これは簡単にシンボルに置き換えることができます。記号はとに:alive :unsureなり:deadます。これを行う代わりに、プレーヤーが生きているかどうかを確認するには:

if player_status == 1

これを行うことができます:

if player_status == :alive

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.