TaKesso's Tech Blog

Web中心の技術メモ

Ruby: Stringクラスのメソッド

REx - Ruby Examination で解いた問題の解説を自分なりにまとめ直すシリーズです。

問題

次のコードを実行するどどうなりますか

arr = [1,2].product([3,4]).transpose
p arr

選択肢

  1. [[1, 3], [1, 4], [2, 3], [2, 4]]と表示される
  2. [[1, 3], [2, 4]]と表示される
  3. [1, 2]と表示される
  4. [[1, 1, 2, 2], [3, 4, 3, 4]]と表示される

解答

正解は [4] です

解説

.product

  • 配列からそれぞれ1つ要素を取り出し、新しい配列を作る

例: [1,2].product([3,4])

product 3 4
1 [1, 3] [1, 4]
2 [2, 3] [2, 4]

.transpose

  • 行と列を入れ替えた配列を作る
  • 一次元の配列に対しては、例外 TypeError が発生する
arr = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
].transpose

p arr
# => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

参考: instance method Array#transpose (Ruby 2.1.0)

問題

次のコードを実行するとどうなりますか

a = "Ruby"
b = " on Rails"
a.concat b
a.reverse
p a.index("R", 1)

解答

正解は 8 です

解説

String#index(pattern, pos)

  • 文字列のpos番目からpatternを検索し、最初に見つかった位置を返します
  • 位置は左端が0で、1文字ずつ増えてく感じ
R u b y o n R a i l s
0 1 2 3 4 5 6 7 8 9 10 11 12

irbでの実行結果

irb(main):001:0> a = "Ruby"
=> "Ruby"
irb(main):002:0> b = " on Rails"
=> " on Rails"
irb(main):003:0> a.concat b
=> "Ruby on Rails"
irb(main):004:0> a.reverse
=> "sliaR no ybuR"
irb(main):005:0> a
=> "Ruby on Rails"
irb(main):006:0> a.index("R", 1)
=> 8