Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
シンボル.to_s / to_proc / inspect
シンボル(Symbol)が持つ変換メソッドです。文字列への変換や、ブロックの代わりに使える『to_proc』の活用方法を解説します。
構文
# シンボルを文字列に変換します。 シンボル.to_s シンボル.id2name # to_s の別名 # シンボルを Proc オブジェクトに変換します。 シンボル.to_proc # & をつけてブロックの代わりに渡します(to_proc を暗黙的に呼び出し)。 配列.map(&:メソッド名) # シンボルをインスペクトします(:name 形式で返します)。 シンボル.inspect # 文字列からシンボルに変換します。 文字列.to_sym
メソッド一覧
| メソッド | 概要 |
|---|---|
| to_s | シンボルを文字列に変換して返します。コロンは含まれません。 |
| id2name | 『to_s』の別名です。 |
| to_proc | シンボルに対応するメソッドを呼び出すProcオブジェクトを返します。 |
| inspect | シンボルをコロン付きの文字列(例: 『:name』)として返します。 |
| to_sym | 文字列をシンボルに変換します(Stringのメソッド)。 |
| length / size | シンボルの文字数を返します(コロンは含みません)。 |
サンプルコード
# to_s: シンボルを文字列に変換します。
sym = :hello
puts sym.to_s # hello
puts sym.to_s.class # String
# inspect はコロン付きで返します。
puts sym.inspect # :hello
# 相互変換。
puts "world".to_sym.class # Symbol
puts :world.to_s.class # String
# to_proc と &: の活用(最重要!)。
数値 = [1, 2, 3, 4, 5]
# ブロックで書く方法。
puts 数値.map { |n| n.to_s }.inspect # ["1", "2", "3", "4", "5"]
# &:to_s で簡潔に書けます(to_proc が暗黙的に呼ばれます)。
puts 数値.map(&:to_s).inspect # ["1", "2", "3", "4", "5"]
# 様々なメソッドで活用できます。
単語 = ["hello", "world", "ruby"]
puts 単語.map(&:upcase).inspect # ["HELLO", "WORLD", "RUBY"]
puts 単語.map(&:length).inspect # [5, 5, 4]
puts 単語.select(&:frozen?).inspect # [](凍結されていない)
# to_proc の仕組みを確認します。
proc = :upcase.to_proc
puts proc.call("hello") # HELLO
概要
シンボルの最大の特徴は、同じ名前のシンボルは常に同一オブジェクトである点です(メモリを節約できます)。文字列と違い、シンボルはイミュータブル(変更不可)です。
『&:メソッド名』の記法はRubyらしいコードを書く上で非常に重要です。この記法は内部で『Symbol#to_proc』を呼び出し、「受け取ったオブジェクトにそのメソッドを呼び出すProc」を生成します。つまり『&:upcase』は『{ |x| x.upcase }』と等価です。
『&:メソッド名』が使えるのは、引数なしのメソッドのみです。引数が必要なメソッドには通常のブロックを使ってください(例: 引数付きの変換は『map { |n| n.round(2) }』のように書きます)。
Procとlambdaの詳細は『Proc.new / proc / lambda / ->』を、ブロックの仕組みは『ブロック / yield』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。