Ruby Silver 試験対策 Day1 (文字列編)

文字列だけが異様なほど長かったので、別の記事に。

バックスラッシュ記法

なにを言っているのかよくわからなかった。

出力メソッドの違い

irb(main):016:0> p "Hello","World","!!"
"Hello"
"World"
"!!"
=> ["Hello", "World", "!!"]
irb(main):017:0> puts "Hello","World","!!"
Hello
World
!!
=> nil
irb(main):018:0> print "Hello","World","!!"
HelloWorld!!=> nil

これらのメソッドは引数を複数指定することが出来て、print以外はそれぞれの間に改行を挟む。 またpではバックスラッシュ記法が適応されず、入力そのままが表示される。

ヒアドキュメント

改行やホワイトスペースなどを、バックスラッシュ記法も用いずに入力そのまま適用できるのがヒアドキュメントである。

flog = <<poem
  かえる
    ぴょこ ぴょこ
      みぴょこ ぴょこ
  あわせて
    ぴょこ ぴょこ
      みぴょこ ぴょこ
poem
puts flog
pyons@LAPTOP-SF87NLCB:/mnt/c/Users/broad/OneDrive/products/Ruby技術者認定試験$ ruby 3-1-1.rb 
  かえる
    ぴょこ ぴょこ
      みぴょこ ぴょこ
  あわせて
    ぴょこ ぴょこ
      みぴょこ ぴょこ

...ほう、すごい。

因みに、メソッドpを使うと

pyons@LAPTOP-SF87NLCB:/mnt/c/Users/broad/OneDrive/products/Ruby技術者認定試験$ ruby 3-1-1.rb 
"  かえる\n    ぴょこ ぴょこ\n      みぴょこ ぴょこ\n  あわせて\n    ぴょこ ぴょこ\n      みぴょこ ぴょこ\n"

確かに、バックスラッシュ記法が全く適用されてない。

なお、ヒアドキュメント開始時にヒアドキュメント終了の合図を宣言するが、これは必ず前に空白を記述してはならない。という、決まりがある。これでは階層の深いところにヒアドキュメントを描くと、インデントが綺麗に整わなくなってしまう。これを回避するためにはヒアドキュメント終了の合図の前にハイフンを付ける。

flog = <<-poem
  かえる
    ぴょこ ぴょこ
      みぴょこ ぴょこ
  あわせて
    ぴょこ ぴょこ
      みぴょこ ぴょこ
                     poem
puts flog #出てくる結果は先ほどと同じ。

ヒアドキュメント内の式展開を明示的に禁止する場合は、終了合図をシングルクウォートで、明示的に許可する場合はダブルクウォートで囲う。

animal = "ウサギ"
flog = <<"poem"
  #{animal}
    ぴょこ ぴょこ
      みぴょこ ぴょこ
  あわせて
    ぴょこ ぴょこ
      みぴょこ ぴょこ
poem
puts flog
puts "---------------------"
flog = <<'poem'
  #{animal}
    ぴょこ ぴょこ
      みぴょこ ぴょこ
  あわせて
    ぴょこ ぴょこ
      みぴょこ ぴょこ
poem

puts flog
pyons@LAPTOP-SF87NLCB:/mnt/c/Users/broad/OneDrive/products/Ruby技術者認定試験$ ruby 3-1-1.rb 
  ウサギ
    ぴょこ ぴょこ
      みぴょこ ぴょこ
  あわせて
    ぴょこ ぴょこ
      みぴょこ ぴょこ
---------------------
  #{animal}
    ぴょこ ぴょこ
      みぴょこ ぴょこ
  あわせて
    ぴょこ ぴょこ
      みぴょこ ぴょこ

パーセント記法

ダブルクォート、シングルクォートだけでなく、文字列を囲む記号を任意の記号(英数字以外)に設定できる。 対になっている括弧記号でもよい。この場合、括弧内で囲まれた文字列内で式展開が可能である。 シングルクォートとしてこれを行う場合は%q[任意の記号]で良い。

a = %-Helloworld-
p a

country = "America"
b = %[GoodMorning, #{country}]
p b

b = %q-GoodMorning, #{country}-
p b
pyons@LAPTOP-SF87NLCB:/mnt/c/Users/broad/OneDrive/products/Ruby技術者認定試験$ ruby 3-1-1.rb 
"Helloworld"
"GoodMorning, America"
"GoodMorning, \#{country}"

最後のパーセンテージ記法だけシングルクォートとして指定したため、式展開ができていない。

文字列演算

破壊的メソッドと非破壊的メソッドの違いが出て切るので注意。 文字列演算のメソッドは原則非破壊的メソッドなので、あまり気にする必要はない。

irb(main):001:0>  a = "ru"
=> "ru"
irb(main):002:0> a + "by"
=> "ruby"
irb(main):003:0> p a
"ru"

ただし、<<メソッドに関しては破壊的メソッドである。

irb(main):006:0> a = "Ruby on"
=> "Ruby on"
irb(main):007:0> a << " Rails"
=> "Ruby on Rails"
irb(main):008:0> p a
"Ruby on Rails"
=> "Ruby on Rails"

また、エンコーディングの異なる文字列同士の計算はできない。 sprintfメソッドによるフォーマット指定の内容が教科書に書いてあるが、それはまた後日。