こんにちは!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パーサーからのデータ: JSONをRubyでパースした場合、デフォルトではハッシュのキーが文字列になります。
シンボルキーを使ったハッシュアクセス
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 なのか、あるいは別の型なのかを確認できます。その型に応じたアクセス方法を選びましょう。
クラス内のインスタンス変数の確認方法
インスタンス変数の取得方法も初めは時間がかかりました。
p obj.instance_variable_get(:@foo)
このように取得するみたいです。
シンボルはRubyのみ存在?
Python、PHP、C、Go、JAVAなどには存在せず、Javascriptには存在するけど、挙動が少し違うようです。
慣れればメリットもあるとの事ですが、他の言語にない概念なので、Ruby使い始めは正直紛らわしかったです。