この記事にはProject Eulerの解答のコードが記載されておりますので、
気になる方は閲覧しないことをお勧めいたします。
Project EulerをRubyで書いてみようと挑戦し、答え合わせの際に見つけた解答例とその疑問点を考える。
Problem 2
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
解答例
class Fibo
class << self
include Enumerable
def each
return to_enum unless block_given?
a = 0; b = 1
loop do
a, b = b, a + b
yield a
end
end
end
end
puts Fibo
.take_while {|i|i < 4000000}
.select(&:even?)
.reduce(:+)
こちらで発見しました。
その際にいくつかわからないことがあったので忘れないようメモ。
class << self
詳しい解説はこちらで拝見しましたが、
特異クラス方式では、class << self と書いた行から end までの間に def class_method のようにクラス名を書かずにインスタンスメソッドと同じようなメソッド定義を書いていきます。この間に書いたものはクラスメソッドとして定義されます。
とのこと。
すごく軽い理解としては、クラス名を省略してメソッド定義を出来る空間のようで、本来であれば(おそらく)
def Fibo.each
とするべきところを、
def each
と省略できているということのようです。
return to_enum unless block_given?
分かっていない。要学習。
消えたeach
Fibo.each.take_while
となるべきeach
が消えているのは、include Enumerable
でEnumerable
がインクルードされており、
その際こちらにもあるように
このモジュールの メソッドは全て each を用いて定義されているので、インクルード するクラスには each が定義されていなければなりません。
each
が必須であることに起因するかと思われる。
それともクラスの中に単一メソッドしかないから?
こちらも早めに調べる。
謎の&:even?
こちらにあるように、
to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます。デフォルトで Proc、Method オブジェ クトは共に to_proc メソッドを持ちます。to_proc はメソッド呼び出し時に実 行され、Proc オブジェクトを返すことが期待されます。
とのこと。