Setter scoping issue

J

James Golick

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?
 
A

ara.t.howard

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?

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://codeforpeople.com/
 
J

James Golick

ara.t.howard said:
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?
 
A

ara.t.howard

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://codeforpeople.com/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top