Trans
6/30/2007 8:49:00 AM
On Jun 29, 4:17 pm, "Erwin Abbott" <erwin.abb...@gmail.com> wrote:
> Hi,
>
> The [] method is really handy when you have an object that should
> behave like a hash or array. One thing I find myself wishing I could
> also do is something like
>
> def logins[](date)
> @events.select{|e| e.action == :login and e.date == date}
> end
>
> There may be a better way to deal with this example, but this is just
> to demonstrate the circumstances where you don't have an array or hash
> called logins, but you'd like to be able to use that [] syntax. One
> way I though about doing it is
>
> def logins
> EventList.new @events.select{|e| e.action == :login}
> end
>
> class EventList
> def initialize data
> @data = data
> end
> def [] date
> @data.select{|e| e.date == date}
> end
> end
>
> logins[Date.today] # => all logins today from @events
>
> I guess some people might prefer to write a method like
> get_logins(date), but I like this syntax. It seems reasonable to also
> define []= in EventList to update the original @events. What I'd like
> to know is if there's another way to solve this problem, or if there
> are any simple optimizations (maybe only keep one instance of
> EventList and update its contents with each call to #events).
def logins
@_logins ||= Proc.new do |date|
@events.select{|e| e.action == :login and e.date == date}
end
end
However, I feel you are limiting yourself. Try something like this
instead:
def logins
@_logins ||= (
l = @events.select{|e| e.action == :login}
def l.by_date(date)
select{|e| e.date == date}
end
l
)
end
Then you can use:
logins.by_date(date)
If needed, you could change #logins to lazy evaluate too.
T.