[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)
# 要素条件を全て指定しなくてもよいようにしたい
}
該当するデータを抽出したいのですが、記述方法が思いたあたらず、
ご教示いただければと思います。