On Oct 7, 2008, at 4:13 PM, Ernest N. Prabhakar, Ph.D. wrote:
Hi all,
One of the more clunky aspects of Hot Cocoa is the need to repeatedly state the object being manipulated, e.g.:
slider :frame => [100, 150, 200, 24] do |s|
s.min = 0
s.max = 100
s.on_action do |sender|
puts "Changed to #{sender.doubleValue}!"
end
endWhile I appreciate the resulting precision, the repetition feels a bit Python-esque to me. :-)
Well, it would be more like this:
slider :frame => [100, 150, 200, 24], :min => 0, :max => 100 do |s|
s.on_action do |sender|
...
end
end
But that aside, your example with _why's patch would not perform as you hope:
slider :frame => [100, 150, 200, 24] do
min = 0
max = 100
on_action do |sender|
...
end
end
In that example, even with mixico it would create local variables min and max, not invoke min= and max= as you may expect. So, although on_action would work in that scenario, it would not help with attr= methods. It would also not help with methods that require an explicit receiver like <<, +, -, etc:
you could not do:
<< view :frame => [....]
and you don't have a way to refer to the slider object either...so how do you get to that object if you need it? You actually cannot call a min= because self.min= is called on the "outer" self object.
You could define
min(0)
by defining:
def min(value=nil)
if value
@min = value
self
else
@min
end
end
so:
min(5) sets @min and min returns @min
I have done this before in dsl's to provide chaining. In that example above min(5) returns self so you can do:
min(5).max(6), etc but that's not necessarily pretty either :-)
All that said, in practice of constructing several HotCocoa apps I don't use tremendous block containment, instead I have methods like:
def main_window(&block)
@main_window ||= create_main_window(&block)
end
private
def create_main_window(&block)
window(:size => [100,100], etc, &block)
end
And I have these types of methods for several views that I create too (or arraycontrollers, etc). So my main methods look nice and clean and the initialization of these elements:
application do |app|
main_window |win|
win.toolbar = main_toolbar
...or whatever
end
end
Anyway, food for thought :-)
Best,
Rich
My impression was that part of the reason for this was to preserve "self" instead of using instance_eval, whic h is understandable. However, _why has come up with a C extension called "mixico" that provides similar functionalityh via mixins, without changing self:
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel