[#408634] How do I make lots of classes aware of each other? — "Andrew S." <lists@...>

I'm apparently missing something fundamental in my knowledge of classes

10 messages 2013/07/02

[#408712] Ruby web service with REST support — "Shubhada S." <lists@...>

Hi All,

17 messages 2013/07/05

[#408812] create variables depending on counter — stefan heinrich <lists@...>

Hi community,

21 messages 2013/07/09

[#408854] execute commands within SMTP email code: send content in variables and not actual variables — dJD col <lists@...>

I am trying to send an email using the code below. I am able to send the

9 messages 2013/07/10

[#409031] tap { break } idiom deserves its own Kernel method? — Andy Lowry <lists@...>

I use this idiom from time to time:

13 messages 2013/07/22

[#409072] Link To Masses Of External Data In Openoffice? — "Austin J." <lists@...>

This is what I want to do.

19 messages 2013/07/23
[#409102] Re: Link To Masses Of External Data In Openoffice? — Tamara Temple <tamouse.lists@...> 2013/07/24

[#409103] Re: Link To Masses Of External Data In Openoffice? — "Austin J." <lists@...> 2013/07/25

tamouse m. wrote in post #1116598:

[#409122] Re: Link To Masses Of External Data In Openoffice? — Tamara Temple <tamouse.lists@...> 2013/07/26

[#409142] Re: Link To Masses Of External Data In Openoffice? — "Austin J." <lists@...> 2013/07/26

tamouse m. wrote in post #1116750:

[#409073] class <=> module — Bráulio Bhavamitra <lists@...>

Hello all,

17 messages 2013/07/23

[#409104] Ruby newbie question on Methods (NoMethoderror) — "Crispian A." <lists@...>

I have recently started learning ruby and so I am writing a small little

10 messages 2013/07/25

[#409170] Working through Ch.10 for learning to program 2.0 (Chris Pine) — JD JD <lists@...>

So, I have been working through this book, and have been doing ok up

33 messages 2013/07/28
[#409195] Re: Working through Ch.10 for learning to program 2.0 (Chris Pine) — Harry Kakueki <list.push@...> 2013/07/29

I tried this and came up with a one-liner that seems to do it. It sorts the

[#409258] WATIR - ScriptError popup on IE - Unable to get rid of! — Graeme Halls <lists@...>

I am new to Ruby & Watir, and I am having a nightmare with IE and Script

11 messages 2013/07/31

Re: tap { break } idiom deserves its own Kernel method?

From: Robert Klemme <shortcutter@...>
Date: 2013-07-22 20:14:01 UTC
List: ruby-talk #409033
On Mon, Jul 22, 2013 at 7:37 PM, Andy Lowry <lists@ruby-forum.com> wrote:

> I use this idiom from time to time:
>
>   x = expr.tap{|value| break expr-involving-value)}
>
> It works well, but reading it requires the reader to understand a
> relatively obscure part of ruby, namely the behavior of break during a
> yield.
>
> Here's my most recent case where the idiom useful: I've got a list of
> model object ids, and I want produce an array of the model objects in
> the order their ids appear in that list.
>
> Obviously, this works:
>
>    id_list.map{|id| Model.find(id)}
>
> Here's an approach that does a single query:
>
>    unsorted = Model.where(id: id_list)
>    objs_map = unsorted.reduce(Hash.new) {|h,o| h[o.id] = o; h}
>    sorted = id_list.map{|id| objs_map[id]}
>
> Here's the same thing using tap/break, to make it more obvious that the
> only thing I'm really interested in is that final value "sorted":
>
>    sorted = Model.where(id: id_list).tap do |unsorted|
>      break unsorted.reduce(Hash.new) {|h,o| h[o.id] = o; h}
>    end.tap do |objs_hash|
>      break id_list.map{|id| objs_hash[id]}
>    end
>
> I find enough uses for this idiom that I'm thinking it'd be worth giving
> it a name and its own Kernel method, rather than forcing the use of a
> relatively narrowly understood language feature (behavior of break
> during yield). "pipe" or "transform" may be a good name for it.
> Definition would be almost identical to that of tap.
>
>   Kernel.module_eval do
>     def pipe
>       yield self
>     end
>   end
>
> Then the example above turns into:
>
>   sorted = Model.where(id: id_list).pipe do |unsorted|
>     unsorted.reduce(Hash.new) {|h,o| h[o.id] = o; h}
>   end.pipe do |objs_map|
>     id_list.map{|id| objs_hash[id]}
>   end
>
> Any thoughts?
>

 I would choose a much less arcane solution:

objs_map = {}
Model.where(id: id_list).each {|o| objs_map[o.id] = o}
sorted = id_list.map{|id| objs_map[id]}

If id_list is smallish (< 30 or so) then index lookup might actually be
faster - or at least fast enough.

sorted = Model.where(id: id_list).sort_by {|o| id_list.index(o)}

Kind regards

robert


-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

In This Thread