[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Re: Using a block to configure/initialize a class

Victor 'Zverok' Shepelev

9/26/2007 12:11:00 AM

From: list-bounce@example.com [mailto:list-bounce@example.com] On Behalf Of
Emmanuel Oga
Sent: Wednesday, September 26, 2007 2:51 AM
>
>Hi! thanks for you replies. I'm going to analyze them. For the moment i
>wanted to answer the question of the unnatural api. The reason i wan't
>to do it that way is because i'm not going to use String or array for
>most of the options, but Structs. So i want a way to let the user do
>this
>
>Struct.new "Value", :sub1, :sub2, :sub3 << In fact, the user may not
>even know about the Struct::Value class.
>
>class Options
>...same as before...
>define_option :an_option
>end
>
>opt= Options.new
>
>opt.an_option do |o|
>o.sub1= ...
>o.sub2= ...
>o.sub3= ...
>end
>
>instead of
>
>an_option.sub1= ...
>an_option.sub2= ...
>an_option.sub3= ...
>--

Acceptable explanation. Then, trying to answer:

1. Defining the method you need "by hands":

class Option
def an_option
@an_option ||= Value.new
yield @an_option if block_given?
@an_option
end
end

2. Designing #define_option

class Option
def self.define_option(name, type)
class_eval %Q{
def #{name}
@#{name} ||= #{type.inspect}.new
yield @#{name} if block_given?
@#{name}
end
}
end

define_option :an_option, Array
end

o = Option.new

p o.an_option # => []

o.an_option { |opt|
opt << 1 << 2 << 3
}

p o.an_option # => [1,2,3]

Really, I think it can be done with more grace (without textual eval).

V.