[#44861] Ruby 1.9のARGVのエンコーディング — rubikitch@...

るびきちです。

17 messages 2008/04/26
[#44862] Re: Ruby 1.9のARGVのエンコーディング — Yukihiro Matsumoto <matz@...> 2008/04/26

まつもと ゆきひろです

[#44863] Re: Ruby 1.9のARGVのエンコーディング — "NARUSE, Yui" <naruse@...> 2008/04/26

成瀬です、パッチ用意してから投げようと思ったら出遅れた、

[#44864] Re: Ruby 1.9のARGVのエンコーディング — Yukihiro Matsumoto <matz@...> 2008/04/26

まつもと ゆきひろです

[#44865] Re: Ruby 1.9のARGVのエンコーディング — "U.Nakamura" <usa@...> 2008/04/28

こんにちは、なかむら(う)です。

[#44866] Re: Ruby 1.9のARGVのエンコーディング — "NARUSE, Yui" <naruse@...> 2008/04/28

成瀬です。

[#44868] Re: Ruby 1.9のARGVのエンコーディング — "U.Nakamura" <usa@...> 2008/04/30

こんにちは、なかむら(う)です。

[ruby-list:44827] 計算するハッシュ

From: "5.5" <5.5@...>
Date: 2008-04-14 14:27:45 UTC
List: ruby-list #44827
5.5 です。こんなこと考えました。

Ruby の Hash#new でブロックを与えるのは,

  Hash.new{|hash, key| hash[key]=[]}

のように,「デフォルト値を設定したいけど,同一オブジェクトでは困る」
という場合が多いと思います。

しかし,ブロックをもっと積極的に使えば,たとえば以下のように i 番目
の素数を返すハッシュを定義することができます。

PRIME_NUMBERS=Hash.new do |hash, index|
  if index<3
    hash.update({1=>2, 2=>3})
    hash[index]
  else
    i_max=hash.size
    if i_max+1==index
      n=hash[i_max]+2
      loop do
        is_prime=(2..i_max).each do |i|
          p_i=hash[i]
          break false if n%p_i==0
          break true if n<p_i**2
        end
        break(hash[index]=n) if is_prime
        n+=2
      end
    else
      (i_max+1...index).each{|i| hash[i]}
      hash[index]
    end
  end
end

puts PRIME_NUMBERS[93774] # => 12121

このようなハッシュは,“連想記憶”というより“キャッシュ付き関数”
とでも呼びたい感じですね。
(“フィルムカメラ”と“レンズ付きフィルム”みたいな関係?)

ハッシュ生成時に与えるブロックは,もはやデフォルト値を与えるとい
う職務を超え,〈知らないキー〉に対する値を泥縄で計算させるものと
見ることもできそうです。(訊かれて慌てて考える,みたいな)

「で,それが何か?」とツッコまれると困るのですが,Ruby のブロック
の威力を示す例になってるかな,と素人なりに思いまして。

ちなみに,上記の PRIME_NUMBERS は,Ruby 1.8 の Prime よりも格段に
速く,ある程度大きな素数になってくると,Ruby 1.9 の Prime よりもさ
らに速いです。

-- 
5.5@moji.gr.jp

In This Thread

Prev Next