module KernelAs you can see, insstance_eval can be used like JavaScript or VB's with. This is nice for the simple reason of documentation. I find this usage much easier to read and understand than most usages of instance_eval that I've seen.
def with(obj = nil, &block)
(obj || self).instance_eval &block
end
end
with("abc") do
puts reverse
end
"abc".with do
puts reverse
end
So, that's it for today. I'll probably be back soon with some recent JRuby developments too.
4 kommentarer:
Neat trick! It's not really fancy Ruby or anything, but it's a cool application of the syntax that's been there all this time. Props.
This is somewhat like the #returning method in Rails' ActiveSupport library:
def returning(value)
yield(value)
value
end
You use it like:
returning obj { |obj| obj.mutate! }
It's essentially the K combinator for Ruby. I like the #returning approach better as it avoids using #instance_eval.
I love this. Very cool.
My only concern is this allows blocks to access member variables directly [due to the use of instance_eval]
so if class A has a member @a...
with (A.new) do
@a = 'something else'
end
executes fine. This worries me.
Of course it does. As he said, it's an alias to instance_eval, in effect. That's why I'd prefer not to make the alias, since 'with' implies a slightly different funcitonality.
Skicka en kommentar