定食屋おろポン

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

Rubyで素数判定してみた

ちょっとした練習に素数判定を書いてみようかと思ったらPrimeクラスの存在を知って絶望した。
それじゃ練習にならないから自前で書いてみた。

class PrimePredicater
  def initialize
    @cache = [2]
  end
  
  def prime?(x)
    extend_cache x if @cache.empty? || x > @cache.last
    @cache.include? x
  end

private
  def _prime?(x)
    @cache.each do |i|
      return false if x % i == 0
    end
    true
  end

  def extend_cache(x)
    (@cache.last + 1 .. x).each do |i|
      @cache.push i if _prime? x
    end
  end
end

prime = PrimePredicater.new
1.upto(100) do |i|
  puts "#{i} is prime? : #{prime.prime? i}"
end

気になるところ

まあ動くんだけど、なんだか「メソッドの返り値は、メソッド内で最後に評価された式の値になる」(returnを明示する必要がない)っていうのに慣れない。

#これを
return false if x % i == 0
#こうしても
break if x % i == 0
#戻り値はx % i == 0の値にならない

if式やbreak, イテレータあたりが返す値についてもうちょっと知識つける必要があるなあ。
せっかくx % i == 0 を評価してtrue/falseを返してるんだから、それをそのままメソッドの返り値に突っ込んだほうが書き方としてスマートっぽい(気がする)
x % i == 0 ならイテレータから抜けて、最後に評価された !(x % i == 0)の値を返すような、そんなスマートなやりかたを探そう...