[ruby-list:50594] [質問] yield の使い方

From: <yamataka@...08.itscom.net>
Date: 2017-10-05 10:56:25 UTC
List: ruby-list #50594
山口と申します。

yield 簡単な使い方が理解できて、便利だと感じ始めたのですが、

以下、コード

require 'pp'

dlna_play_list = [
  {:ch  => '2',
   :bit => '16',
   :fs  => '32000'},
  {:ch  => '2',
   :bit => '16',
   :fs  => '44100'},
  {:ch  => '2',
   :bit => '16',
   :fs  => '88200'},
  {:ch  => '2',
   :bit => '16',
   :fs  => '96000'},

  {:ch  => '6',
   :bit => '16',
   :fs  => '32000'},
  {:ch  => '6',
   :bit => '16',
   :fs  => '44100'},
  {:ch  => '6',
   :bit => '16',
   :fs  => '88200'},
  {:ch  => '6',
   :bit => '16',
   :fs  => '96000'},
 ]

class DlnaPlayList
  def initialize(play_list)
    @play_list = play_list
  end

  def mk_play_list(type)
    case type
    when :fs,:bit,:ch
      @play_list = @play_list.select { |content| yield(content[type].to_
i) }
    end
  end
end

obj = DlnaPlayList.new(dlna_play_list)

# fs,bit,ch 個別での抽出は可能
pp obj.mk_play_list(:fs)  { |fs| fs > 32000 && fs < 96000 }
pp obj.mk_play_list(:bit) { |bit| bit >= 16 }
pp obj.mk_play_list(:ch)  { |ch| ch >= 6 }

のように、fs,bit,chで指定の条件で抽出は可能なのですが...

fs,bit,ch の条件を自由に組合わせたブロックを渡して、

{ |fs,bit,ch|
  (fs > 32000 && fs < 96000) && (bit >= 16)
  # 要素条件を全て指定しなくてもよいようにしたい
}

該当するデータを抽出したいのですが、記述方法が思いたあたらず、
ご教示いただければと思います。



In This Thread

Prev Next