PHPerがRubyistになろうとしてつまづいたところ①シンボル?

こんにちは!WEBアプリケーションエンジニアの小松です!

この記事は[Enigmo Advent Calendar 2024]の15日目の記事です。  

PHPの場合

model['full_name']

こういう変数の持ち方を連想配列と呼んでいただけなので、シンボルキーという言葉と発想がなかったです。

呼び出し方でも

model['full_name'], model[:full_name], model.full_name

などがあり、

<%= debug model %> やログでオブジェクト全体の値が取れてもキーの持ち方が違って取得するのに時間がかかることがありました。

なので、呼び方の具体例や呼び出し方を記載しました。

model['full_name'] のような形式は、文字列キーを持つハッシュから値を取得する方法です。このような形式でのアクセスは、Rubyの基本的なハッシュオブジェクトの操作です。


呼び方の具体例

文字列キーを使ったハッシュアクセス

Rubyでは、ハッシュのキーとして文字列(String)を使う場合に、この形式でアクセスします。

model = { 'full_name' => 'AIR JORDAN 13(エアジョーダン13)' }
puts model['full_name']  # => "AIR JORDAN 13(エアジョーダン13)"

文字列キーアクセスを使う場面

JSONパーサーからのデータ: JSONRubyでパースした場合、デフォルトではハッシュのキーが文字列になります。

シンボルキーを使ったハッシュアクセス

Rubyでは、ハッシュのキーとしてシンボル(Symbol)を使うことも一般的です。この場合は、:full_name のようにしてアクセスします。

model = { full_name: 'AIR JORDAN 13(エアジョーダン13)' }
puts model[:full_name]  # => "AIR JORDAN 13(エアジョーダン13)"

オブジェクト形式(OpenStruct)のアクセス

OpenStruct を使うと、ドット演算子(.)でプロパティにアクセスできます。

require 'ostruct'
model = OpenStruct.new(full_name: 'AIR JORDAN 13(エアジョーダン13)')
puts model.full_name  # => "AIR JORDAN 13(エアジョーダン13)"

 

確認方法

model.class を実行することで、オブジェクトがハッシュなのか、OpenStruct なのか、あるいは別の型なのかを確認できます。その型に応じたアクセス方法を選びましょう。

 

クラス内のインスタンス変数の確認方法

インスタンス変数の取得方法も初めは時間がかかりました。

docs.ruby-lang.org

p obj.instance_variable_get(:@foo) 

このように取得するみたいです。

 

シンボルはRubyのみ存在?

PythonPHP、C、Go、JAVAなどには存在せず、Javascriptには存在するけど、挙動が少し違うようです。

qiita.com

慣れればメリットもあるとの事ですが、他の言語にない概念なので、Ruby使い始めは正直紛らわしかったです。