このブログ読んで頂いてる方から、メールいただきました。
今日は、そのご報告を。
StockListLoaderを、stock_list_loader_check.rbにてテストするが、
以下の部分、
puts sll.market_sections.include?(“東証2部”) #=> true
sll.filter_by_market_section(“東証1部”)
puts sll.market_sections.include?(“東証2部”) #=> false
filter_by_market_sectionで絞込みをしても、データが更新されない。
最後の sll.market_sections.include?(“東証2部”) がtrueのまま。
ああ、ワタクシも見落としていました。やっぱ目検はダメだなぁ。
確認したところ、不具合ですね。
def market_sections
@market_sections ||= stock_info.map {|info| info[:market_section]}
end
これでは、
最初に初期化された後は、データが更新されません。
||= ですから。nilのときしかデータ更新しません。
ちなみに、他のプロパティも全て一緒です。
これでは、本体のstock_infoはデータ更新されても、
更新後のデータを取り出せません。
||= を = に変えてしまえば解決しますが、
毎回処理をさせると重くなってしまうので、避けたい。
そこで、filter_by_market_sectionのようにデータの変更が発生したら、
各プロパティにnilを設定して、呼び出されるときに再度データ操作する。
という風に改造しました。
def filter_by_market_section(*sections)
return self unless sections[0]
@stock_info = stock_info.find_all do |info|
sections.include?(info[:market_section])
end
clear()
self
end
private
def clear()
@codes=nil
@market_sections=nil
@units=nil
end
これで問題解決です。動作確認もしました。
filter_by_market_sectionを使わなければ、もともと特に問題はないので、
大きな不具合なのかどうかは、判断つきません。
以上、不具合の報告でした。
まあ、こういうこともあります。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。