サーチ…


構文

  • :シンボル
  • :'シンボル'
  • :"シンボル"
  • "シンボル" .to_sym
  • %s {シンボル}

備考

文字列にシンボルを使用する利点:

1. Rubyシンボルは、O(1)比較のオブジェクトです

2つの文字列を比較するには、潜在的にすべての文字を見る必要があります。長さNの2つの文字列の場合、これにはN + 1回の比較が必要です

def string_compare str1, str2
  if str1.length != str2.length
        return false
  end
  for i in 0...str1.length
    return false if str1[i] != str2[i]
  end
  return true
end
string_compare "foobar", "foobar"

しかし、foobarが出現するたびに同じオブジェクトが参照されるため、オブジェクトIDを調べることでシンボルを比較できます。 1つの比較でこれを行うことができます(O(1))

def symbol_compare sym1, sym2
  sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar

2. Rubyシンボルは自由形式の列挙型のラベルです

C ++では、関連する定数のファミリを表すために「列挙」を使用できます。

enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status  = CLOSED;

しかし、Rubyは動的な言語なので、BugStatus型の宣言や法定値の追跡は心配しません。代わりに、列挙値をシンボルとして表します。

original_status = :open
current_status  = :closed

3. Rubyシンボルは定数で一意な名前です

Rubyでは文字列の内容を変更できます:

"foobar"[0] = ?b # "boo"

しかし、シンボルの内容を変更することはできません。

:foobar[0]  = ?b # Raises an error

4. Rubyシンボルは、キーワード引数のキーワードです

Ruby関数にキーワード引数を渡すとき、シンボルを使ってキーワードを指定します:

# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
        :action => 'show',
        :id => bug.id

5. Rubyシンボルは、ハッシュキーにとって優れた選択肢です

通常、シンボルを使用してハッシュテーブルのキーを表します。

options = {}
options[:auto_save]     = true
options[:show_comments] = false

シンボルを作成する

Symbolオブジェクトを作成する最も一般的な方法は、文字列識別子の前にコロンを付けることです。

:a_symbol       # => :a_symbol
:a_symbol.class # => Symbol

Symbol Stringリテラルと組み合わせて定義する別の方法があります:

:"a_symbol"
"a_symbol".to_sym

シンボルには、文字列の%q%Q動作と同様の任意の区切り文字をサポートする%sシーケンスもあります。

%s(a_symbol)
%s{a_symbol}

%sは、空白を含む入力からシンボルを作成するのに特に便利です:

%s{a symbol} # => :"a symbol"

いくつかの興味深いシンボル( :/ 、: :[]:^など)は特定の文字列識別子で作成できますが、数値識別子を使用してシンボルを作成することはできません。

:1 # => syntax error, unexpected tINTEGER, ...
:0.3 # => syntax error, unexpected tFLOAT, ...

シンボルは単一で終わることがあり?または!シンボルの識別子として文字列リテラルを使用する必要はありません。

:hello?  # :"hello?" is not necessary.
:world!  # :"world!" is not necessary.

シンボルを作成するこれらの異なるメソッドはすべて、同じオブジェクトを返すことに注意してください。

:symbol.object_id == "symbol".to_sym.object_id
:symbol.object_id == %s{symbol}.object_id

Ruby 2.0には、単語からシンボルの配列を作成するためのショートカットがあります:

%i(numerator denominator) == [:numerator, :denominator]

文字列をシンボルに変換する

与えられたString

s = "something"

それをSymbolに変換するにはいくつかの方法があります:

s.to_sym
# => :something
:"#{s}"
# => :something

シンボルを文字列に変換する

与えられたSymbol

s = :something

これをStringに変換する最も簡単な方法は、 Symbol#to_sメソッドを使用することです。

s.to_s
# => "something"

これを行う別の方法は、 Symbol#id2nameメソッドのエイリアスであるSymbol#to_sメソッドを使用することです。しかし、これはSymbolクラスに固有のメソッドです:

s.id2name
# => "something"


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow