Ruby Silverの勉強を始めました。

Ruby Silverの勉強を始めました。今回はStringクラスについて書きました。

なんでRuby Silverを受けようと思ったか

フィヨルドブートキャンプでRubyの文法などを学びましたが、知識不足なところを感じる場面がありました。
そこで、体系的にもう一度復讐したいという気持ちから、RubyExamination(REx)を解いていました。
せっかく模擬問題解いてるなら、受けてみてもいいかなと思い、受験しようと思い立ちました。
(Ruby Silverずっと気になってから、手が付けられて嬉しい)

参考

また勉強をしている中で、わからなかった箇所などを、アウトプットの練習も兼ねて書いていこう思います。

String#chop

  • 末尾の文字を取り除いた文字列を返します。
  • 破滅的変更はしない。
irb(main):005:0> str = 'string'
=> "string"
irb(main):006:0> str.chop
=> "strin"
irb(main):007:0> str
=> "string"
  • 末尾に\r\nがあればその2文字を除去
irb(main):010:0> p "string\r\n".chop 
"string"
=> "string"

# もちろん1文字でも除去する
irb(main):015:0> p "string\n".chop 
"string"
=> "string"
irb(main):031:0> p "string\r".chop 
"string"
=> "string"

末尾を1文字削除するメソッド、\r\nは2つ削除するというのは、不思議だなと思っていましたが、
OSごとに改行コードが違ったり、意味も少し違うという背景があるということを知りました 🤔

参考

String#scan

  • selfに対して、指定したpatternを繰り返し、マッチした文字列を配列で返す。
irb(main):006:0> str = "aaabbcccddd"
=> "aaabbcccddd"
irb(main):007:0> p str.scan("c")
["c", "c", "c"]
=> ["c", "c", "c"]
  • patternには正規表現も指定可能
  • 正規表現を括弧で指定した場合、一致した文字列の配列の配列を返す
irb(main):015:0> str = "aaabbcccddd"
=> "aaabbcccddd"
irb(main):016:0> str.scan(/./)
=> ["a", "a", "a", "b", "b", "c", "c", "c", "d", "d", "d"]
irb(main):017:0> str.scan(/(.)/)
=> [["a"], ["a"], ["a"], ["b"], ["b"], ["c"], ["c"], ["c"], ["d"], ["d"], ["d"]]

参考

String#split

  • 指定した要素で文字列を分割し、配列で返す
  • 正規表現を指定した場合かつ、括弧を指定すると指定した要素も配列で返す
irb(main):019:0> p "Spring,Summer,Autumn,Winter".split(/,/)
["Spring", "Summer", "Autumn", "Winter"]
irb(main):020:0> p "Spring,Summer,Autumn,Winter".split(/(,)/)
["Spring", ",", "Summer", ",", "Autumn", ",", "Winter"]
  • 第2引数にlimitを与えることができ、limit個で文字列を分割。デフォルト値は1。
irb(main):027:0> p "Spring,Summer,Autumn,Winter".split(/,/, 2)
["Spring", "Summer,Autumn,Winter"]
=> ["Spring", "Summer,Autumn,Winter"]

Ruby2.6からブロックを渡すことができるようになった。

  • ブロックを渡した場合、返り値はself
  • ブロックに渡る値は、要素で分割された文字列
# ブロックを使用しない場合

irb(main):028:1* def is_fruit?(value)
irb(main):029:1*   %w(apple mango banana watermelon grapes guava lychee).include?(value)
irb(main):030:0> end
=> :is_fruit?

irb(main):031:0> input_str = "apple, mango, potato, banana, cabbage, watermelon, grapes"
=> "apple, mango, potato, banana, cabbage, watermelon, grapes"

irb(main):033:0> splitted_values = input_str.split(", ")
=> ["apple", "mango", "potato", "banana", "cabbage", "watermelon", "grapes"]

irb(main):034:0> fruites = splitted_values.select { | value | is_fruit?(value) }
=> ["apple", "mango", "banana", "watermelon", "grapes"]

# ブロックを使用した場合

irb(main):041:0> fruits = []

irb(main):039:0> input_str
=> "apple, mango, potato, banana, cabbage, watermelon, grapes"

irb(main):042:0> input_str.split(", ") { | value | fruits << value if is_fruit?(value) }
=> "apple, mango, potato, banana, cabbage, watermelon, grapes"

irb(main):043:0> fruits
=> ["apple", "mango", "banana", "watermelon", "grapes"]

分割と判定を同時に進めているので手間が少なくなっていて便利

参考