Teaprog.com

とあるエンジニアの日々の記録。エンジニアと関係のないようなことも書きます。

Rubyにおける「"」と「'」の違い

f:id:tk0137:20210709220042j:plain

イメージ図

目次

はじめに

 

今回もまたRuby言語に挑戦してみました。

 

前回のRubyの記事↓↓↓↓↓

 

teaprog.com

 

 前回のRubyの記事では、文字列の出力を実装していました。

 

その際、変数に文字列を代入していました。

 

変数に代入するときは以下のように「"」(ダブルクォート)もしくは「'」(シングルクオート)で代入したい文字列を囲みます。

 

a = "文字列"
b = '文字列'

 

この場合はputs関数で変数a、bの両方をputs関数で出力させると、結果は同じになります。

 

ここで少し疑問が生まれるかも知れません。

 

では「"」(ダブルクォート)と「'」(シングルクオート)はどのように使い分けるのかという事です。

 

上の例だけでは、使い分ける必要が内容に見えます。

 

しかし、「"」(ダブルクォート)と「'」(シングルクオート)で意味が違ってくる場面がありますので、今回はその例を紹介したいと思います。

 

内容

 

「"」(ダブルクォート)と「'」(シングルクオート)の違いを簡単にまとめるとすのであれば、「文字列内の規則を無視するか否か」ではないでしょうか。

 

そのいくつかの例を以下に示します。

 

 「\n」:改行文字

 

まず改行文字です。

 

文字列ないに「\n」を入力すると、それは改行文字として認識されます。

 

この改行文字を「"」(ダブルクォート)か「'」(シングルクオート)内に入れるかで挙動が変わるのです。

 

以下のようなプログラムを実行してみます。

 

#to_s.rb
puts "気持ちを強く\n持つのですよ?" puts '気持ちを強く\n持つのですよ?'

 

違いは、「気持ちを強く\n持つのですよ?」という文字列を「"」(ダブルクォート)で囲んでいるか「'」(シングルクオート)で囲んでいるかのみです。

 

f:id:tk0137:20210713213522j:plain

 

上に示したプログラムを実行した結果が以下の図のとおりです。

 

文字列を「"」(ダブルクォート)で囲んでいる場合は文字列が指定した箇所で改行されています。

 

しかし「'」(シングルクオート)で囲んでいた場合は改行文字である「\n」がそのまま文字列として表示されてしまいます。

 

f:id:tk0137:20210713213536j:plain

 #{式}:式展開

 

もう一例ご紹介します。

 

Rubyには「式展開」という仕組みがあります。

 

まず以下のようなプログラムを見てみましょう。

 

#to_s2.rb
name = 'Dia' puts "Hello, #{name}!" puts 'Hello #{name}!'

 

上のプログラムにおける「#{name}」という部分が式展開を実行している部分になります。

 

「#{}」の中括弧の中に式を入力すると、その式の結果が文字列として出力されるという事です。

 

つまり上の例で説明します。

 

"name"という変数に"Dia"と代入しています。

 

そしてputs "Hello, #{name}!"という文で変数nameの式展開を行っています。

 

"name"には先ほど"Dia"という文字列を入力していました。

 

よって出力画面には"Hello Dia"と表示されるのです。

 

式展開は、変数に代入する文字に影響されるので、変数に代入する文字を変更するだけでまとめて複数行の式展開の出力結果を変更することもできる便利な機能ですね。

 

ところがこの式展開という仕組みも「"」(ダブルクォート)で囲むか「'」(シングルクオート)で囲むかによって挙動が変わってきます。

 

f:id:tk0137:20210713213549j:plain

 

以下の図に上で示したプログラムの実行結果を示します。

 

最初に示した実行結果から予想はできたかも知れませんが、「"」(ダブルクォート)で囲んだ場合は式展開が実行され、"Hello, Dia!"と表示されました。

 

しかし「'」(シングルクオート)で囲んだ場合は式展開を実行する"#{name}"という文字列がそのまま表示され、"Hello #{name}!"と表示されてしまいました。

 

f:id:tk0137:20210713213603j:plain

 

これらの実行結果から少し「"」(ダブルクォート)と「'」(シングルクオート)の性質の違いが分かりました。

 

「"」(ダブルクォート)で囲んで場合は、文字列の中にある式や規則を実行する性質があり、「'」(シングルクオート)で囲んだ場合は、文字列の中にある式や規則を無視して、そのまま文字列として表示する性質があるようです。

 

おまけ

 

最後にこれらの「"」(ダブルクォート)と「'」(シングルクオート)を活用する上で便利な機能がありますので紹介します。

 

その機能とは「\」(バックスラッシュ)です。

 

文字列の中にある式や規則の前に「\」(バックスラッシュ)をつけるとその式や規則の実行が無視されます。

 

以下にプログラム例を示します。

 

#to_s3.rb
name = 'Dia' puts "\#{name} #{name}"

 

puts関数で先ほどのプログラム同様に式展開を出力させるプログラムです。

 

しかし、1番目の"#{name}"の前には「\」(バックスラッシュ)を入力してみます。

 

f:id:tk0137:20210713213633j:plain

 

以下に上で示したプログラムを実行した結果を示します。

 

「\」(バックスラッシュ)をつけた方の"#{name}"は実行されずにそのまま文字列として表示される事が確認できました。

 

f:id:tk0137:20210713213646j:plain

 

あまり使いどころがわからない「\」(バックスラッシュ)ですが、あるシーンでは役立つこともあります。

 

例えば以下に示したプログラムを見てみましょう。

 

#正しく認識しない

puts 'Mari said "It's joke!"'

 

文法的には間違っていないのですが、このように「"」(ダブルクォート)と「'」(シングルクオート)が複雑に絡む文字列では、コンピュータが正しく対応づけてくれません。

 

以下の図に示したように文字列の途中で色が変わっており、文字列のアポストロフィーとして処理して欲しいところを文字列の区切りである「'」(シングルクオート)として認識してしまっている事が分かります。

 

f:id:tk0137:20210713213658j:plain

 

このような時に「\」(バックスラッシュ)が役に立ちます。

 

文字列のアポストロフィーとして処理して欲しい「'」(シングルクオート)の前に「\」(バックスラッシュ)を入れます。

 

#正しく認識される

puts 'Mari said "It's joke!"'

 

すると「'」(シングルクオート)の区切り文字としての特別な機能を無視して文字列としてコンピュータが認識してくれます。

 

f:id:tk0137:20210713213710j:plain

 

以下に「\」(バックスラッシュ)を入れて正しく文字列を認識してくれる状態でのプログラムの実行結果を示します。

 

以下のように、正しく英文の文字列が表示されました。

 

f:id:tk0137:20210713213941j:plain

最後に

 

正直に申し上げますと、Ruby言語を学ぶ事でこの先私にどんないい事があるのかはあまり考えておりません。

 

単純な新しいことに対する興味だけで触っています。

 

また、Ruby言語は日本人が開発したプログラミング言語であるということは知っていました。

 

なので何となく親近感が湧いているのかも知れません。

 

またRubyに関する記事は何回か書くかも知れません。

 

以上、簡単でしたが最後までありがとうございました。