[#28509] Rational — Tadayoshi Funaba <tadf@...>

ふなばです。

49 messages 2006/04/05
[#28510] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28512] Re: Rational — Tadayoshi Funaba <tadf@...> 2006/04/05

ふなばです。

[#28513] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/05

原です。

[#28514] Re: Rational — keiju@... (石塚圭樹) 2006/04/05

けいじゅ@いしつかです.

[#28517] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28520] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28521] Re: Rational — Yukihiro Matsumoto <matz@...> 2006/04/06

まつもと ゆきひろです

[#28525] Re: Rational — keiju@... (石塚圭樹) 2006/04/06

けいじゅ@いしつかです.

[#28527] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/06

原です。

[#28536] Re: Rational — Shin-ichiro HARA <sinara@...> 2006/04/10

原です。

[#28537] Re: Rational — keiju@... (石塚圭樹) 2006/04/10

けいじゅ@いしつかです.

[#28589] Float#div and Float#divmod [AGAIN] — Shin-ichiro HARA <sinara@...>

原です。

16 messages 2006/04/23

[ruby-dev:28498] proc & block

From: Hidetoshi NAGAI <nagai@...>
Date: 2006-04-03 09:53:08 UTC
List: ruby-dev #28498
永井@知能.九工大です.

現在の Proc オブジェクトはブロックを受け取ることができませんが,
これを受け取ることができるようにすることは難しいでしょうか.

例えば
------------------------------------------------------------------
def foo(a,b,c)
  [a, b, c, block_given?]
end
------------------------------------------------------------------
に対して,
------------------------------------------------------------------
x = proc{|m, *args| [block_given?, m.call(*args)] }
x.call(method(:foo), 1,2,3){p 111}  #=> [false, [1, 2, 3, false]]
------------------------------------------------------------------
ではブロックを与えることができません.

ブロックを与えることができるようにするためには
------------------------------------------------------------------
def bar(m, *args, &blk)
  [block_given?, m.call(*args, &blk)]
end
x = method(:bar)
x.call(method(:foo), 1,2,3){p 111}  #=> [true, [1, 2, 3, true]]
------------------------------------------------------------------
というようにメソッドを定義する必要があります.

proc オブジェクトが block 引数を取れるようになれば,
------------------------------------------------------------------
x = proc{|m, *args, &blk| [block_given?, m.call(*args, &blk)] }
x.call(method(:foo), 1,2,3){p 111}  #=> [true, [1, 2, 3, true]]
------------------------------------------------------------------
とできて,余計なメソッド定義をしなくて済むのですが...

ただしその場合,現状の
------------------------------------------------------------------
def baz
  proc{|*args| [block_given?, *args]}
end

baz.call(1,2,3)         #=> [false, 1, 2, 3]
baz{p 111}.call(1,2,3)  #=> [true, 1, 2, 3]
------------------------------------------------------------------
という挙動とどう折り合いをつけるかという問題は生じます.
この点についてはまだ考えがまとまっていません.
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai@ai.kyutech.ac.jp

In This Thread

Prev Next