From: Gennady Bystritsky Date: 2006-10-28T03:35:03+09:00 Subject: Re: can there be a "with" construction? Jacob Fugal wrote: > On 10/27/06, Gennady Bystritsky wrote: >> matt neuburg wrote: >>> Some languages have a "with" construction, where undefined methods >>> are routed to a designated object. Here's an example from UserTalk: >>> >>> with system.startup { >>> string(license) >>> } >>> >>> UserTalk knows what "string" is, but when it can't find "license" it >>> reinterprets it as system.startup.license, which works. In >>> UserTalk, you can even chain these tests: >>> >>> with system.temp, system.startup { >>> string(license) >>> } >>> >>> That means we try system.temp.license and if that doesn't exist we >>> proceed to system.startup.license. >>> >>> So my question is: is Ruby amenable to this kind of construction? Is >>> there a way to bend the language to that it acts like this? Thx - m. >> >> Something like this? >> >> def with(*objects) >> begin >> yield >> rescue NoMethodError => exception >> o = objects.detect { |_o| >> _o.respond_to? exception.name >> } or raise >> >> o.send exception.name, *exception.args >> end >> end > > It's a start, but: > > 1) I don't think we really want to redispatch NoMethodErrors for > messages that had an explicit receiver. Only the ones with implicit > receivers. > > 2) it stops execution of the block after redispatching the > first exception: > > with(Time) do > "aaa".now > puts "Never get here" > end # nothing printed > > Jacob Fugal Hmm... I must have misunderstood the OP. I somehow thought that in "those" languages string(license) translates to calling method "license" on "string", hence the solution. My bad, sorry. Gennady.