[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Setter scoping issue

James Golick

10/13/2007 10:05:00 PM

So, I had this really cool idea for a syntax.

class Options
attr_accessor :something, :something_else
end

class Post
@@options ||= Options.new
def self.options(&block)
@@options.instance_eval &block if block_given?
@@options
end
end

Post.options.something = "something"
assert_equal "something", Post.options.something

Post.options do
something = "something"
something_else = "something_else
end
assert_equal "something", Post.options.something
assert_equal "something_else", Post.options.something_else

That's the idea anyway. A shorthand for scoping setters. If you want
to set one option, you call the whole method chain. If you want to set
multiple options, you use a block.

Unfortunately, the setters don't seem to work in the block without an
explicit self.

Post.options do
self.something = "something"
self.something_else = "something_else
end

...which defeats the entire purpose of the shorthand.

Anybody have any ideas?
--
Posted via http://www.ruby-....

3 Answers

ara.t.howard

10/13/2007 10:26:00 PM

0


On Oct 13, 2007, at 4:04 PM, James Golick wrote:

> So, I had this really cool idea for a syntax.
>
> class Options
> attr_accessor :something, :something_else
> end
>
> class Post
> @@options ||= Options.new
> def self.options(&block)
> @@options.instance_eval &block if block_given?
> @@options
> end
> end
>
> Post.options.something = "something"
> assert_equal "something", Post.options.something
>
> Post.options do
> something = "something"
> something_else = "something_else
> end
> assert_equal "something", Post.options.something
> assert_equal "something_else", Post.options.something_else
>
> That's the idea anyway. A shorthand for scoping setters. If you want
> to set one option, you call the whole method chain. If you want to
> set
> multiple options, you use a block.
>
> Unfortunately, the setters don't seem to work in the block without an
> explicit self.
>
> Post.options do
> self.something = "something"
> self.something_else = "something_else
> end
>
> ...which defeats the entire purpose of the shorthand.
>
> Anybody have any ideas?
> --
> Posted via http://www.ruby-....
>

cfp:~ > ruby a.rb
cfp:~ > ruby a.rb
cfp:~ > cat a.rb
require 'attributes' ### gem install attributes

class Options
attributes :something, :something_else
end

class Post
@@options ||= Options.new

def self.options &block
@@options.instance_eval &block if block_given?
@@options
end
end

Post.options.something = "something"
abort unless "something" == Post.options.something

Post.options do
something "something"
something_else "something_else"
end
abort unless "something" == Post.options.something
abort unless "something_else" == Post.options.something_else

p :success



cfp:~ > ruby a.rb
:success



a @ http://codeforp...
--
share your knowledge. it's a way to achieve immortality.
h.h. the 14th dalai lama



James Golick

10/13/2007 10:38:00 PM

0

ara.t.howard wrote:
> On Oct 13, 2007, at 4:04 PM, James Golick wrote:
>
>> @@options
>> assert_equal "something", Post.options.something
>> Post.options do
>> self.something = "something"
>> self.something_else = "something_else
>> end
>>
>> ...which defeats the entire purpose of the shorthand.
>>
>> Anybody have any ideas?
>> --
>> Posted via http://www.ruby-....
> require 'attributes' ### gem install attributes
> Post.options do
> something "something"
> something_else "something_else"
> end


Thanks a lot. That's really nice. We lose the equals sign though.
I'll gladly keep this, if need be, but I'd really like to keep the
equals sign.

Is it possible?
--
Posted via http://www.ruby-....

ara.t.howard

10/13/2007 10:47:00 PM

0


On Oct 13, 2007, at 4:37 PM, James Golick wrote:

>
> Thanks a lot. That's really nice. We lose the equals sign though.
> I'll gladly keep this, if need be, but I'd really like to keep the
> equals sign.
>
> Is it possible?

nope. not without self too. trust me, the open syntax grows on you too

widget.configure {
width 42
height 42.0
color 'blue'
}

looks very nice in a config file or class parameterization.

regards.

a @ http://codeforp...
--
it is not enough to be compassionate. you must act.
h.h. the 14th dalai lama