Rubyのシンボルについて

アプリケーション

概要

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) # => 無効

参考


関連書籍