LoginSignup
1
1

More than 5 years have passed since last update.

Rubyを勉強する

Posted at

この記事には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 EnumerableEnumerableがインクルードされており、
その際こちらにもあるように

このモジュールの メソッドは全て each を用いて定義されているので、インクルード するクラスには each が定義されていなければなりません。

eachが必須であることに起因するかと思われる。

それともクラスの中に単一メソッドしかないから?

こちらも早めに調べる。

謎の&:even?

こちらにあるように、

to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます。デフォルトで Proc、Method オブジェ クトは共に to_proc メソッドを持ちます。to_proc はメソッド呼び出し時に実 行され、Proc オブジェクトを返すことが期待されます。

とのこと。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1