Help us understand the problem. What is going on with this article?

文字列のダブルクォーテーションの扱いに関して

More than 1 year has passed since last update.

パースエラー

以下のコマンドのエラーの原因を考えてみましょう

ruby -e " 100.times{|n| puts "a" } "

シンタックスハイライトを見ればわかる通り、aの部分をも文字列として扱いたいのに途中でダブルクォーテーションが使われているため、以下のようなエラーが表示されます。(ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]を使用しました。)

-e:1:in `block in <main>': undefined local variable or method `a' for main:Object (NameError)
    from -e:1:in `times'
    from -e:1:in `<main>'

おもな回避方法は2つあります。

シングルクォーテーションに置き換える

以下の二つのコードはエラーが出ずにきちんと表示されます。

ruby -e '100.times.do{|n| puts "a"}'
ruby -e "100.times.do{|n| puts 'a'}"

上のコードははじめと終わり、下のコードは2番目と3番目をシングルクォーテーションに置き換えました。もし、はじめのダブルクォーテーションだけを置き換えたら何が起こるでしょうか?

ruby -e '100.times{|n| puts "a"}"

文字列のはじめを表すシングルクォーテーションしかないため、エンターを押してもコマンドが終わってないものだと認識され、入力の続きを求められます。
こういう場合はCtrl + D一回使って終わらせましょう。(押す回数は一回で大丈夫です)

エスケープシークエンスを使う。

ダブルクォーテーションを使った文字列の中でどうしても、ダブルクォーテーションを使いたいというときがあると思います。そういう時に使うのがエスケープシーケンスです。
使い方は文字列として扱いたいダブルクォーテーションの前にバッククォート(Windowsなら¥)を入れるだけです。

ruby -e "100.times{|n| puts \"a\"}"
stmtk
Complex System/Alife/fractal lang: C++/ Haskell/clojure/ ruby/ python/ nim /vim
https://stmtk.github.io
yyphp
PHPerが毎週集まり、ざっくばらんに情報交換する雑談コミュニティ
https://yyphp.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away