Patrick Hurley
4/1/2006 2:04:00 AM
On 3/31/06, Patrick Hurley <phurley@gmail.com> wrote:
> On 3/31/06, Jeff Thorne <jeff_thorne@yahoo.com> wrote:
> > I am new to ruby from java and had a question on blocks.
> >
> >
> >
> > Can a block be applied to a writeable attribute or setter? I keep getting
> > errors so I
> >
> > am assuming no but I wanted to double check in case my syntax is incorrect.
> >
> >
> >
> > Thanks for the help,
> >
> > Jeff
> >
> >
> >
> >
> >
> > class Test
> >
> >
> >
> > def initialize(one, two)
> >
> > @one = one
> >
> > @two = two
> >
> > end
> >
> >
> >
> > def one=(one)
> >
> > @one = one;
> >
> > Yield;
> >
> > end
> >
> >
> >
> > attr_reader :one, :two
> >
> > attr_writer :two
> >
> >
> >
> > end
> >
> >
> >
> >
> >
> >
> >
> > test = Test.new("Hello", 2);
> >
> > test.one = 3 { puts "Test Block" }
> >
> >
> >
> >
> >
>
> You are correct it is not allowed, but I am curious why you want to do
> this? Also if I were to go and write a setter that took a block,
> wouldn't you either pass the new value into the block or use the
> result of the block to set the variable?
>
> class Test
> def a=(a)
> @a = a
> yield @a if block_given?
> end
>
> #or
> def b=(b)
> @b = (block_given?) ? yield b : b
> end
> end
>
> pth
>
>
Sorry just to be clear, I do not think that method= methods are
allowed to take anything more than a single parameter -- when using
the normal "call" syntax.
Of course you can send a message to it with a block:
class A
attr_reader :a
def a=(a,&b)
@a = block_given? ? yield(a) : a
end
end
a=A.new
a.a = 7
p a.a
a.a = 1
bl = Proc.new { |v| v * 6 }
a.send "a=", 7, &bl
p a.a