4/27(水)にNTT-ATさんの会議室にてkawasaki.rb #035を開催しました。
togetterのまとめはこちら
パーフェクトRuby読書会
「5-2-5 繰り返し処理」まで終えました。
5-2-3 文字列の整形
String#stripは文字列の前後の空白文字(半角スペースと\t\r\n\f\v)を取り除いた文字列を返します。 右端のみはString#rstrip、左端のみはString#lstripを用います。
1
2
3
4
str = " hi \t"
str.strip # => "hi"
str.rstrip # => " hi"
str.lstrip # => "hi \t"
String#chompは末尾の改行コードを一つだけ取り除いた文字列を返します。
1
"hi \n\n".chomp # => "hi \n"
String#compは末尾の一文字を取り除いた文字列を返します。
1
'Users'.chop # => "User"
会場ではchopってそんなに使う?という話から他の手段がいくつか挙げられました。
1
2
3
4
# sub + 正規表現で末尾文字削除
"foo.".sub(/\.$/,'') # => "foo"
# indexで末尾文字削除
"foo."[0...-1] # => "foo"
String#squeezeは、文字列の中の連続した部分をまとめることができます。
1
2
3
4
5
6
7
'yahoooooooooooooooooo'.squeeze # => "yaho"
'aabbbccdd'.squeeze('abc') # => "abcdd"
'aabbbccdd'.squeeze('a-c') # => "abcdd"
'aabbbccdd'.squeeze('^a') # => "abcdd"
' aabb'.squeeze("\s") # => " aabb"
# シングルクォートではスペース文字として判定されない
' aabb'.squeeze('\s') # => " aabb"
大文字や小文字の変換は以下のようなメソッドがあります。
1
2
3
4
5
6
7
8
# すべて小文字
'ABC'.downcase # => "abc"
# すべて大文字
'abc'.upcase # => "ABC"
# 大文字と小文字を変換
'Abc'.swapcase # => "aBC"
# 先頭のみ大文字
'tiTle'.capitalize # => "Title"
余談として、ActiveSupportにはさらにメソッドが用意されています。
1
2
"camel_case".camelize # => CamelCase
"SnakeCase".underscore # => "snake_case"
文字列置換にはString#subやString#gsubを使用します。 gsubはマッチする文字列全てを置換します。
1
2
3
4
5
'55-9-7-24'.sub(/[0-9]+/, 'x') # => "x-9-7-24"
'55-9-7-24'.gsub(/[0-9]+/, 'x') # => "x-x-x-x"
# ブロックも渡せる
'55-9-7-24'.gsub(/[0-9]+/) {|str| str.to_i.succ} # => "56-10-8-25"
'55-9-7-24'.gsub(/([0-9]+)/) { $1.to_i.succ } # => "56-10-8-25"
これらのメソッドには、破壊的メソッドが存在します。
1
2
3
4
5
str = ' hi '
str.strip! # => "hi"
str # => "hi"
# 変更がない場合nilが返ってたまにハマる
str.strip! # => nil
String#reverseは文字列を反転させます。
1
2
'dam'.reverse # => "mad"
'ダムダムダムダムダム'.reverse # => "ムダムダムダムダムダ"
5-2-4 配列への変換
String#splitは渡されたセパレータで文字列を分割します。
1
2
3
4
5
6
7
str = 'America, Briten, Canada'
str.split(',') # => ["America", " Briten", " Canada"]
# 正規表現も渡せる
str.split(/,\s+/) # => ["America", "Briten", "Canada"]
# 第二引数は分割する最大値を指定できる
str.split(/,\s+/, 2)[1] # => "Briten, Canada"
splitやeach_charで、文字列を文字ごとの配列にすることができます。
1
2
'Alice'.split(//) # => ["A", "l", "i", "c", "e"]
'Alice'.each_char.to_a # => ["A", "l", "i", "c", "e"]
5-2-5 繰り返し処理
each_charにはブロックを渡すこともできます。
1
2
3
4
5
'ブフー'.each_char { |c| c}
# =>
# "ブ"
# "フ"
# "ー"
改行ごとに繰り返すにはeach_lineを使用します。
1
2
3
4
5
"Alice\nBob\nCarrot".each_line{|line| line}
# =>
# "Alice\n"
# "Bob\n"
# "Carrot"
each_lineの引数には改行とみなす文字列を指定することができます。 デフォルトでは変数$/が使用されます。
1
2
3
$/ # => "\n" # 環境で変わる
"Alice\tBob\tCarrot".each_line("\t"){|line| line}
次回は「5-2-6 エンコーディングの扱い」からです。
今回のiruby notebookは以下のとおりです。
セッション
Enumerableモジュールを機能(ほぼ)全部まとめ 〜 select, inject, take などなど from @kon_yu
Enumerableに備わっているメソッドの使い方と、それをeachで書いたらこんなに大変!という話をされました。 一方で、zipやlazyとか使う?という話から会場から意見さまざまな意見が出されました。
発表元となった記事はこちら
Rubyで体重を量る話 from @xmisao
TANITAが販売している体組成計がWifiを経由してTANITAのサーバにデータを送っており、それをREST APIで取得できることから、Gemという形でクライアントを作った話をされました。
発表元となったGemはこちら
次回予告
次回は2016/5/25(水)(毎月第4水曜日)開催予定です。ご参加お待ちしております。
寄稿者について
松久保 敬人 (@Peranikov)
node.jsやiOSアプリ開発を経て今はRailsとDDDとScalaの人。 最近ちょっとだけGoに浮気した。