0

シンボルを説明するコードの下に遭遇したRubyの本を読んでいます

def walk(direction)
  if direction == :north
    # ...
  end
end

同様のメソッドを作成しようとしましたが失敗しました(

direction == :north

ほとんどの場合、シンボルが のように使用されているのを見てきたparam[:name]ため、コードで試してみ:north = 1 or :favourite = 'ruby'ましたが、構文エラーが発生しました。

シンボルのみを使用して(ハッシュなしで)、つまり代わりにそのような比較を行うことは本当に可能ですか

if "ruby" == param[:name]
end

if "ruby" == :name
end

質問を明確に表現したかどうかはわかりません。そうでない場合は、言い換えてみます。

4

2 に答える 2

2

シンボルは、識別子、または文字列の特別なバージョンのようなものです。

文字列を使用すると、次のことができます

str1 = 'SYM'

str2 = 'symbol'
str2 = str2[0,3].upcase

これで、メモリ内の異なる場所に2 つの同一の文字列が存在します。Ruby はすべての文字を比較して評価する必要がありstr1 == str2ます。

ただし、シンボルは一意です。それらに対して文字操作を行うことはできません。

sym1 = :SYM
sym2 = :SYM

その場合、1 回の比較だけでそれらが等しいかどうかをテストできます。文字列とシンボルのオブジェクト ID を見ると、これが明確に示されています。

puts str2.object_id
puts str1.object_id

puts sym1.object_id
puts sym2.object_id

puts str1.to_sym.object_id
puts str2.to_sym.object_id

出力

22098264
22098228
203780
203780
203780
203780

したがって、2 つの文字列のオブジェクト ID は異なりますが、2 つのシンボルは実際には同じオブジェクトです。2 つの文字列をシンボルに変換しても、同じオブジェクト ID が得られるため、 1 つ しかありません:SYM

記号は:north = 1なので、そのまま書いても意味がありません'north' = 1

文字列をシンボルと比較すると、 like'north' = :northは常に を返しfalseます。これらは異なるクラスのオブジェクトであるためです。

param[:name]任意のオブジェクトでハッシュをインデックス化できるという理由だけで機能します。(あなたは言うことができます。)それは(リテラル文字列によるハッシュのインデックス付け)または(変数の内容param[Object.new] = 1によるハッシュのインデックス付け)のいずれかを書くこととは異なります。param['name']param[name]name

これはあなたの質問に答えていますか?

于 2013-08-28T17:12:27.063 に答える