私はRubyの世界にまったく慣れていないので、シンボルの概念に少し混乱しています。シンボルと変数の違いは何ですか?変数だけを使用しないのはなぜですか?
ありがとうございます。
コメント
- Lispで–Rubyの派生元-シンボルは本質的に変数のデータ型です。つまり、実行時にリフレクション風の方法でプログラムを操作できます(最も一貫性のある説明ではありません。申し訳ありません)。
回答
変数と記号は異なるものです。変数は異なる種類のデータを指します。Rubyでは、シンボルは変数というよりも文字列に似ています。
Rubyでは、文字列は可変ですが、シンボルは不変です。つまり、シンボルのコピーを1つだけ作成する必要があります。持っている
x = :my_str y = :my_str
:my_str
は一度だけ作成され、x
とy
は同じメモリ領域を指します。一方、
x = "my_str" y = "my_str"
a文字列が含まれていますing my_str
は 2回作成され、x
とy
は異なるインスタンスを指します。
その結果、シンボルは、Rubyの列挙型と同等のものとして、また辞書へのキー(ハッシュ)として使用されることがよくあります。
コメント
- @mipadi 'ポイントを押すだけで、文字列を比較するときに、すべての文字を相互に比較する必要があります。したがって、同一の文字列を比較するのはO(n)です。ルビーシンボルはオブジェクト参照を比較しますが、ウィッチはO(1)です。
- Pythonにこれがないのはなぜですか?
- 最後に知っていたので、それらを使いすぎないように注意する必要があります。しかし、私はルビー> 1.9でこれを調べたことがありません'、シンボルは' t gc ' dを取得すると、メモリを消費する可能性があります
-
#mySymbol
のように見えることを除いて、Smalltalkでも同じように動作します。 。 - @ frogstarr78-プログラムでシンボルを生成している(最初にチェックせずに文字列をインターンする)場合を除いて、'シンボルの数が多すぎることを心配する必要はありません。
回答
Rubyの記号は、基本的に実世界の記号と同じです。何かを表す、または名前を付けるために使用されます。
シンボルは、ある種の状態を表すために非常に一般的に使用されます。たとえば、
order.status = :canceled order.status = :confirmed
あなたシンボルをインスタント列挙型と見なすこともできます。シンボルを定義する必要はありません。シンボルを使用するだけです。この記事ではシンボルについて詳しく説明しています。
コメント
- これまでのほとんどの'よりも優れた説明
回答
通常、変数は文字列と混同される傾向がありますが、変数のように考えていることは理解できます。理解できます。このように考えてください。
ゲーム内のプレーヤーのステータスは数字で表されます。 1は生きていることを意味し、2は不確かであることを意味し、3は死んでいることを意味します。これは簡単に記号に置き換えることができます。記号は、:alive
:unsure
および:dead
の場合があります。プレーヤーが生きているかどうかを確認するには、これを行う代わりに:
if player_status == 1
これを行うことができます:
if player_status == :alive