Ruby Language
シンボル
サーチ…
構文
- :シンボル
- :'シンボル'
- :"シンボル"
- "シンボル" .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"