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

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

ありがとうございます。

コメント

  • Lispで–Rubyの派生元-シンボルは本質的に変数のデータ型です。つまり、実行時にリフレクション風の方法でプログラムを操作できます(最も一貫性のある説明ではありません。申し訳ありません)。

回答

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

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

x = :my_str y = :my_str 

:my_strは一度だけ作成され、xyは同じメモリ領域を指します。一方、

x = "my_str" y = "my_str" 

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

その結果、シンボルは、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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です