Integer
整数かどうか判定したい
p 10.integer? p 1.1.integer?
整数か偶数か判定したい
# 偶数ならtrue,奇数ならfalse p 10.even?
整数か奇数か判定したい
# 奇数ならtrue,偶数ならfalse p 11.odd?
整数の絶対値を取得したい
p 10.abs p -10.abs
整数の値が0かを判定したい
p 0.zero? p 10.zero?
2つの整数の最大公約数がほしい
p 2.gcd(7)
2つの整数の最大公約数と最小公倍数がほしい
p 3.gcdlcm(7)
起点となる整数から1ずつ減らしながらminまでブロックを繰り返したい
# self.downto(min) {|n|} 10.downto(1) {|n| p n}
起点となる整数から1ずつ増やしながらmaxまでブロックを繰り返したい
# self.upto(max) {|n|} 1.upto(10) {|n| p n}
起点となる整数から指定したstep数ずつ加算しながらlimitまでブロックを繰り返したい
# self.step(limit, step = 1) {|n|} 2.step(10, 2) {|n| p n}
Integer回数だけブロックを繰り返したい。ただし、回数に指定できるのは正の整数のみ
カウントは0からスタートする
# self.times {|n|} 10.times {|n| p n}
10進法から2進法、8進法、16進法に基数変換したい
String#%はsprintfと同じ
# 10進法<=>2進法 "%b" % 251 251.to_s(2) 0b11111011.to_s # 10進法<=>8進法 "%o" % 8 8.to_s(8) 010.to_s # 10進法<=>16進法 "%x" % 251 251.to_s(16) 0xfb.to_s # 任意の位取り記法文字列を整数へ変換したい "6z".to_i(36) "18b".to_i(12) "18b".to_i(16) "101100".to_i(3)
ちなみにto_sの引数は2 <= x <= 36まで可能(この範囲を超えた引数を与えるとエラー)
階乗冪(かいじょうべき)、順列、階乗、組み合わせの値を求めたい
結論:自前で実装しろ。
モンキーパッチで書くならこんな感じ
class Integer def falling_factorial(m) return (0..(m - 1)).inject(1) {|r, k| r * (self - k)} end def rising_factorial(m) return (0..(m - 1)).inject(1) {|r, k| r * (self + k)} end alias permutation falling_factorial def factorial return self.permutation self end def combination(m) return (self.permutaton m) / (m.permutation m) end end
GoogleIMEの新機能がうざい
GoogleIMEがアップデートして、直接入力か日本語入力かをレコメンドする機能が入った。
Google 日本語入力の安定版をアップデートしました。(1.11.1515.10x) - Google Japan Developer Relations Blog
これが非常に邪魔臭いので、設定で以下のチェックボックスを外すことで対応。
なんでこんな機能入れたんだろう……。
String
デフォルトエンコーディング
Ruby2.0からデフォルトエンコーディングがUTF-8に。
文字列のエンコーディングを変更する
Stringオブジェクトは、自分自身のエンコーディング情報を持っている。これを変更するには
hoge = "Hoge".encode("EUC-JP")
p hoge.encoding
文字列やバイナリデータを16進数ダンプする
[0].scan(/[0-9a-f]{2}/)
16進数ダンプを文字列やバイナリデータに変換する
["48656c6c6f2c20776f726c64"].pack("H*")
文字列をBase64エンコード
require 'base64' a = "Hellow World" p Base64.encode64(a) b = Base64.encode64(a) p Base64.decode64(b)
文字列内で変数の展開
文字列内で変数を展開するには#{}を使う
a = "hoge"
puts "Hellow, #{a}"
puts "1 + 3 = #{1 + 3}"
単一引用符や二重引用符を含む文字列を扱う
バックスラッシュ\でエスケープできるが、連続して使うと読みづらいしミスの原因になる
puts "Hellow, \"Hoge\""
文字列の先頭に%おき、半角記号で文字列を囲めばそのまま単一引用符や二重引用符を使える(パーセント記法)。パーセント記法は二重引用符で囲んだ文字列と同じ扱いになる
puts %!"Hi", 'Yahoo'!
puts %!"1 + 3 =" '#{1 + 3}'!
ヒアドキュメントを使う
複数行に渡るような長い文字列を使いたい場合はヒアドキュメントを使う
puts <<EOF やーこまったこまった すげー困ってる困ってる はっはっはっは EOF
ヒアドキュメントを使って複数のshellコマンド実行結果を文字列に設定する
s= <<`EOS` date echo "-----------------------------" ps EOS
文字列の結合
# インスタンス自体に結合する場合 str1 = "Hellow" str1 << " Ruby" str1.concat(" World!") # 返り値に結合した文字列を返す場合 str2 = "Hellow" puts str2 + " World"
文字列を指定いた回数繰り返した値を返す
puts "Hey " * 3
大文字・小文字に揃える
s = "i love Ruby" # 大文字に揃える puts s.upcase #=> "I LOVE RUBY" # 小文字に揃える puts s.downcase #=> "i love ruby" # 先頭のみ大文字に、残りは小文字に揃える puts s.capitalize #=> "I love ruby"
upcase、downcase、capitalizeの後ろに!つけると破壊的な操作ができるけど、基本使わん。
大文字と小文字の入れ替え
……いつ使うんだこれ?
puts "i lOVE rUBY".swapcase #=> "I Love Ruby"
コマンドの実行結果を文字列として受け取る
コマンドをバッククォートで囲む。
puts `date`
部分文字列を取り出す
s = "Apple Banana Orange" p s[0..4] #=> "Apple" p s[6, 6] #=> "Banana" # 範囲を指定すればその範囲の文字が、ピンポイント指定だと文字コードが返る p s.slice(0,3) #=> "App" p s.slice(6) #=> 'B' p s.slice(13..18) #=> "Orange"
部分文字列を置き換える
s = "Apple Banana Orange" # 範囲指定 s[0..4] = "Vine" #=> s = "Vine Banana Orane" # 開始地点と長さ指定 s[5, 6] = "Lemon" #=> s = "Vine Lemon Orange"
文字列を1文字ずつ処理する
"Hellow Ruby".each_char{|c| puts c}
文字列を1文字ずつバイトで処理する
"Hellow Ruby".each_byte{|c| puts c}
文字列を1行ずつ処理する
s = <<EOS This is test. Ruby, the Object Oriented Script Language. EOS s.each_line{|line| puts line}
文字列の先頭と末尾の空白文字を削除する
" Hello, Ruby! ".strip #=> "Hello, Ruby!"
文字列を整数に変換する
"999".to_i
文字列を浮動小数点に変換する
"10.1".to_f
8進数文字列を整数に変換する
"010".oct
16進数文字列を整数に変換する
"0xff".hex
ASCII文字<=>コード値に変換
p "R".bytes p 82.chr p "%c" % 82
文字列を中央寄せ・左詰め・右詰めする
CUIツールを作るとき便利
s = "Ruby" # 10文字を基準にずらす p s.center(10) #=> " Ruby " p s.ljust(10) #=> "Ruby " p s.rjust(10) #=> " Ruby"
「次」の文字列を取得する
シーケンシャルな識別子を出すときに使える、とあるが、なかなか使いドコロがなくて存在を忘れる。
p "9".succ #>= "10" p "a".succ #>= "b" p "AAA".succ #>= "AAB" p "A99".succ #>= "B00" p "A099".succ #>= "A100"
文字列中で指定したパターンにマッチする最初の文字列を置換する
s = "Apple Banana Apple Orange" p s.sub("Apple", "Pine") #=> "Pine Banana Apple Orange"
文字列中で指定したパターンにマッチする全ての文字列を置換する
s = "Apple Banana Apple Orange" p s.gsub("Apple", "Pine") #=> "Pine Banana Pine Orange"
文字列内に含まれる任意文字列の一を求める
見つからなかったらnilが返る
s = "Apple Banana Apple Orange" p s.index("Apple") #=> 0 p s.index("Banana") #=> 6 p s.index("Apple", 6) #=> 13 p s.rindex("Apple") #=> 13 p s.rindex("Apple", 6) #>= 0
文字列の末端の改行を削除する
入力受け取るときに大活躍
p "Hellow, Ruby!\n".chomp
文字列を任意の区切り文字で分割し配列にする
"001,TAKEUCHI Hitoshi,Yokohama".split(",") #=> ["001", "TAKEUCHI Hitoshi", "Yokohama"]