1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【文字列関連まとめ】Rubyのややこしいシンボルとは

Last updated at Posted at 2020-03-25

はじめに

Rubyの文字列は"hoge"'hoge':hogeなど非常にややこしいと感じているのは自分だけでしょうか。
コロンがついている:hogeは正しくは文字列ではなくシンボルと呼ばれているものですが、非常に文字列と似ているため最初のうちは混乱すると思います。(まあややこしいんで別に使わなくていいんですけどね)
本記事では主に"hoge"'hoge':hogeの3つについて解説します。
さらに、%Q(hoge)%W(hoge)なんてものもありますが、こちらは使いどころが多くないため、簡単な解説に絞ります。

“hoge”と’hoge’

ご存知、文字列の基本ですね。ダブルクオーテーションやシングルクオーテーションで囲うことで文字列であることを表します。ほとんどの言語で使われているので知っていると思います。

“hoge”と’hoge’のどちらを使うか

基本的にはどちらを使っても良いです。しかし、Rubyの使用上、「特殊文字」「式展開」を使うときは””で囲う必要があるため日頃から””を使うことをおすすめします。

特殊文字、式展開については以下で説明します。

特殊文字

\n(改行)や\t(タブ)などのこと。(他にもあるので調べてみてください。)
以下の様にhello worldの中に特殊文字を入れた例で見てみる。

.rb
puts "He\nllo wor\tld"
puts 'He\nllo wor\tld'

実行結果は以下の様になります。

He
llo wor ld
He\nllo wor\tld

ダブルクォーテーションの方は改行とタブが入っていて、シングルクォーテーションの方は文字がそのまま出ていることがわかります。

式展開

#{}で囲むことで変数を出力したり、計算結果を出力できたりする。

.rb
price = 100

puts "税込価格は#{price * 110 / 100}円です。"
puts '税込価格は#{price * 110 / 100}円です。'

実行結果は以下の様になります。

税込価格は110円です。
税込価格は#{price * 110 / 100}円です。

ちなみに式展開を利用せずに書くと以下の様になります。コードが長く見辛くなるため式展開は覚えておくと良いでしょう。

.rb
puts "税込価格は" + (price * 110 / 100).to_s + "です"

:hoge

コロンがついたものはシンボルと言われるものです。他の言語にはないため戸惑う人も多いと思います。

内部的な詳しい解説は他の人に任せるとして簡単に説明します。

シンボルの有用性

シンボルは、ソースコード上では文字列のように見え、内部的には整数値として管理されています。もちろん文字列はソースコード上でも内部的にも文字列として管理されています。

では内部的に整数値で管理することのなにがよいかというと、処理速度が上がるんですよね。整数値は0~9の組み合わせですが、文字列は膨大な数の文字がありますから。

極論、シンボルが嫌いなら一切使わずにコードを書くこいてもOKです。

シンボルの使いどき

その文字列自体に意味があるときは文字列、意味がないときはシンボルを使いましょう。
わかりやすいのはハッシュのキーと値です。

例えば、人 = {名前 => 山田太郎, 住所 => 東京都}というハッシュがあったとします。

「山田太郎」や「東京都」はその文字自体に意味があります。もし全て整数に変換されてしまったらわけわかめですよね。

逆に「名前」や「住所」は、値を取り出すためのキーです。「山田太郎」は人[名前]、「東京都」は人[住所]で取り出せます。

別にハッシュを人 = [なーまーえ => 山田太郎, じゅーしょ => 東京都]として、人[なーまーえ]、人[じゅーしょ]で取り出してもいいですよね。こういうときにシンボルを使います。

ルーティングなどにもよく使われていますね。

ハッシュでの利用

:hogeではなくhoge:という記述があって戸惑ったことがもしかしたらあるかもしれません。これもシンボルを表し、書き方が特殊なだけです。

先に述べた様に、シンボルはハッシュにおいてよく使われるので書きやすい特殊な書き方が用意されています。

下の3つはほぼ同じハッシュを表していますが、3つ目の書き方に後ろにコロンがついているのがわかると思います。これがhoge:の正体です。

.rb
# シンボルを使わず定義
person = { "name" => "山田太郎", "address" => "東京都" }

# シンボルを使って定義 
person = { :name => "山田太郎", :address => "東京都" }

# シンボルを使って特殊な書き方で定義
person = { name: "山田太郎", address: "東京都" }

キーを文字列で定義したときは取り出すときも文字列を指定、シンボルで定義したときは取り出すときもシンボルを指定する必要があるということに注意しましょう。

ハッシュの定義は慣れないうちは混乱すると思います。こちらの記事も参考にしてみてください。非常に整理されています。

%Q()と%W()

あまり使うことはないかと思いますが、"hoge"は%Q(hoge)、'hoge'は%q(hoge)と表すことができます。
これのメリットが感じられるのは中の文字列に"や'がたくさんある時です。

私は"山田"です。と表したいときは以下の様になり、エスケープする必要がない分%Q()のほうが可読性が高いことがわかります。

.rb
puts "私は\"山田\"です。"

puts %Q(私は"山田"です。)

また、文字列の配列を定義するときに有用なのが%W()で、以下の2つは同じ配列を表します。
コンマ区切りでなくなっていることに注意しましょう。

.rb
puts [ "red", "blue", "yellow" ]

puts %W( red blue yellow )

こんなものもあるんだ程度に覚えていれば大丈夫でしょう。

まとめ

Rubyには、「使いこなせると便利だけど最初のうちは意味がわからない」ということが多い様に思います。シンボルもその一つでしょう。

基本的には文字列と変わらないけど、ハッシュのキーなどの文字列自体に意味のないものに使うべしと覚えましょう。

質問などございましたらTwitterまでTwitter@ruemura3

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?