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

これが非常に邪魔臭いので、設定で以下のチェックボックスを外すことで対応。

なんでこんな機能入れたんだろう……。

f:id:totobook:20130817201016p:plain

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"]