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#chop (Ruby 3.2 リファレンスマニュアル)
- 改行コードの違い「CR」と「LF」と「CRLF」 | VBA Create
- 改行コードの種類の「CR」「LF」「CRLF」の意味と違い | Cプロ
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"]
分割と判定を同時に進めているので手間が少なくなっていて便利