From: Patrick Hurley Date: 2006-04-01T11:04:08+09:00 Subject: Re: question on blocks On 3/31/06, Patrick Hurley wrote: > On 3/31/06, Jeff Thorne 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