定食屋おろポン

おろしポン酢と青ネギはかけ放題です

基礎から真面目にRuby-数値編-

amazon:初めてのRuby3章を読みます。
数値に対する演算もだいたいがメソッドのシンタックスシュガーって点以外は、言語ごとの違いとして覚えるだけな内容が多い。
むしろ、多倍長とか型の自動変換とか、大抵のことはよしなにやってくれるので覚えることもあまりない。

ビットアクセス

Fixnum|Bignum#[]

がちょっとびっくり。数値に[]が付けられるなんてね。なんという多態性。(多態性って言いたいだけ)

self[nth] -> Fixnum
nth 番目のビット(最下位ビット(LSB)が 0 番目)が立っている時 1 を、そうでなければ 0 を返します。

つまりこういうことですね。

def accessBits(num)
  str = ""
  length = ("%b".%num).length #2進数にした時の長さ
  length.downto(0) do |i|
    str << num[i].to_s
    str << ", " unless i == 0
  end
  return str
end

p accessBits(31)

# 出力
"0, 1, 1, 1, 1, 1"

この適当なlengthの演算はnumがマイナスだとダメみたいよ!"%b".%(-31)に"..100001"が返ってくるからね。

divmodちゃん可愛い

多重代入とあわせて

a, b = 100.divmod(7)
puts "商:#{a}, あまり:#{b}"

a, b = (100.5).divmod(7)
puts "商:#{a}, あまり:#{b}"

# 出力
商:14, あまり:2
商:14, あまり:2.5

かわいい。

宇宙船演算子ちゃんかわいい

見た目もやることも宇宙船演算子ちゃんかわいい。とはいえ、実際に使うには実例等を参考にしっかり実装しないと痛い目を見そう。

class Fixnum
  def <=>(x)
    return -1 if self%3 < x%3
    return 1 if self%3 > x%3
    return 0 if self%3 == x%3
  end
end

p [3, 4, 2, 6, 7, 10].sort

# 出力
[3, 6, 10, 4, 7, 2]

かわいい。