Rubyのシンボルについて書く。
任意の文字列と対に対応するオブジェクト。
内部実装では、整数として管理されている。
:symbol
:'symbol'
%s!symbol!
シンボルはSymbolクラスのオブジェクトであり、文字列はStringクラスのオブジェクトである。そのためメモリ効率が良い。
文字列と違い、シンボルは同一のオブジェクトである。
# シンボルは全て同じID
puts :symbol.object_id # => 865628
puts :symbol.object_id # => 865628
puts :symbol.object_id # => 865628
# 文字列は全て異なるID
puts 'symbol'.object_id # => 60
puts 'symbol'.object_id # => 80
puts 'symbol'.object_id # => 100
また、シンボルはイミュータブルなオブジェクトでもある。
# 書き換え不可であるためエラーとなる
symbol = :Symbol
symbol.sub(/Sym/, 'sym') # => undefined method `sub' for an instance of Symbol (NoMethodError)
用途として次のようなケースがある。
# ハッシュのキー
hash = { :key => "value" }
puts hash[:key] # => value
# アクセサの引数で渡すインスタンス変数名として使用
class Order
attr_reader :id
def initialize(id)
@id = id
end
end
order = Order.new(1)
puts order.id # => 1
# メソッド引数で渡すメソッド名として使用
text = "hello"
puts text.__send__(:to_s) # => hello
# Cのenum的な使用
STATUS_ACTIVE = :active
STATUS_INACTIVE = :inactive
def puts_status(status)
case status
when STATUS_ACTIVE
puts "有効"
when STATUS_INACTIVE
puts "無効"
end
end
puts_status(STATUS_ACTIVE) # => 有効
puts_status(STATUS_INACTIVE) # => 無効
関連書籍