Help us understand the problem. What is going on with this article?

Rubyでブロックとメソッドをコールバック処理として実行する

More than 1 year has passed since last update.

前回作ったHello Rubyの処理

前回、Hello Rubyで作った処理をせっかくなので、勉強がてらクラス構文で定義してみる事にした。
ついでに、ブロック、メソッドそれぞれを利用したコールバック処理をできるようにしてみた。

まずは前回作ったやつを少し直したのがこれ。

(変更前)combination.rb
R = 9

numbers = (1..100).to_a

# 組み合わせを列挙しながらtestメソッドを実行
def test(*combinations) # *を頭に付けると引数が可変長配列になるらしい
  p combinations
end

numbers.repeated_combination(R) { |*combination| test(combination) }

今風?のコールバックの基本は、どうやら、呼び出し側で、

hoge(){ |ret| #blk処理 }

としておいて、hoge()内では、

yield

と実装してコールバックするのがシンプルでいいらしい。
とは言え、メソッドをそのままコールバックとしたい事もあろうかと思い、その方法もやってみた。

ブロックとメソッドをコールバックとしてするよう作り直した結果

(変更後)combination.rb
R = 3

class Combinations
  # ブロックをコールバックとして実行するメソッド
#これでもイケる
#  def findWithBlk(ary, r, &blk)
  def findWithBlk(ary, r)
    #yieldでコールバック実行
#これでもイケる
#    ary.repeated_combination(r) { |*combination| blk.call(combination) } 
    ary.repeated_combination(r) { |*combination| yield(combination) }
  end

  # メソッドをコールバックとして実行するメソッド
  def findWithMethod(ary, r, method)
    #与えられたメソッドを.call()でコールバック実行
    ary.repeated_combination(r) { |*combination| method.call(combination) }
  end

  #強引にブロックとメソッドで両方コールバック実行するメソッド
  def find(ary, r, method=nil)
    #ラムダの無名関数
    callback = lambda{|method, combination|
      if block_given?
        yield(combination)
      elsif method !=nil
        method.call(combination)
      end
    }
    ary.repeated_combination(r) { |*combination| callback.call(method, combination) }
  end
end



numbers = (1..100).to_a

# ブロックをコールバックとして実行
cmb = Combinations.new
cmb.findWithBlk(numbers, R) { |*combination| p combination }

# #メソッドをコールバックとして実行
def callback(*combination)
  p combination
end
cmb.findWithMethod(numbers, R, method(:callback))

#試しに、強引にブロックとメソッドで両方コールバック実行してみる
cmb.find(numbers, R, method(:callback))
cmb.find(numbers, R) { |*combination| p combination }

ところで、ブロックとメソッドは何が違うんだ?
どういう性質で、どう使い分けるとか、そこら辺も調べていきたい。
オーバーロードがRubyには無いんだろうか。クラスのメソッド名を同じにしたらエラーが出た。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away