[#46340] ASR 1.8.7 同梱の exerb で生成したプログラムが enumerator を見つけられない — "(株)ネットフォレスト 植田裕之" <ueda@...>

植田と申します。

10 messages 2009/09/01
[#46344] Re: ASR 1.8.7 同梱の exerb で生成したプログラムが enumerator を見つけられない — arton <artonx@...> 2009/09/01

artonです。

[#46345] Re: ASR 1.8.7 同梱の exerb で生成したプログラムが enumerator を見つけられない — "NARUSE, Yui" <naruse@...> 2009/09/01

成瀬です。

[ruby-list:46396] 高階関数的なメソッドの使い方について

From: ツムジ <the.little.schemer@...>
Date: 2009-09-16 14:10:19 UTC
List: ruby-list #46396
最近、Project Euler の問題を Ruby を使って解いているのですが、その時に
ちょっと疑問に思ったことがあったので、メールしてみました。

実際の Project Euler の問題は少し込み入っているので、内容を単純化した
もので例を示してみます。

例えば次のようなコードがあるとします。

class Integer
  def triangle                  # 三角数
    return (self + 1) * self / 2
  end
  def square                    # 四角数
    return self * self
  end
  def pentagon                  # 五角数
    return (3 * self * self - self) / 2
  end
end

ここで、a[0]、a[1]、a[2] にそれぞれ 100 以下の三角数、四角数、五角数を
集めていくとします。

同じような処理を繰り返したくないので、 Integer#triangle、
Integer#square、Integer#pentagon をブロックで包んでオブジェクト化して使
うことを考えました。

func = [lambda{|x| x.triangle},
        lambda{|x| x.square},
        lambda{|x| x.pentagon}]
a = Array.new
3.times do |i|
  a[i] = Array.new
  1.upto(1/0.0) do |j|
    n = func[i].call(j)
    break if n > 100
    a[i].push(n)
  end
end

このコードでしっかり目的は達成できるのですが、ちょっと気になることがあ
ります。

もともと func[0], func[1], func[2] はブロックをオブジェクト化したもので
した。それをまたブロックで包んで使用するのは、ちょっとすっきりしない気
がします。でも、"lambda" を使うにはブロックの形でメソッドを渡す必要があ
るので、今回はこの形にしました。

今回私がとった方法以外に、高階関数のようにメソッドをうまく使う方法はな
いのでしょうか?

追記:
ちなみに、実際に Project Euler を解いたときのコードは
<http://tsumuji.cocolog-nifty.com/tsumuji/2009/09/project-euler-1.html>
に書いてあります。

In This Thread

Prev Next