Forum: Ruby question on blocks

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Cab5e5dbfd348fe340735b6254f11361?d=identicon&s=25 Jeff Thorne (Guest)
on 2006-04-01 03:14
(Received via mailing list)
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" }
B97225f66bb5caac601b12735d430a0d?d=identicon&s=25 Marcin MielżyÅ?ski (Guest)
on 2006-04-01 03:50
(Received via mailing list)
Can anyone explain this: ?

class A
     def x
         yield
     end

     def x=a
         yield
     end
end

a=A.new
a.x{p "called"}
a.x=1 do
     p "called"
end


../test.rb:13: parse error, unexpected kDO, expecting $


lopex
2c51fec8183a5d21c4e11b430beabb47?d=identicon&s=25 Patrick Hurley (Guest)
on 2006-04-01 03:50
(Received via mailing list)
On 3/31/06, Jeff Thorne <jeff_thorne@yahoo.com> wrote:
>
>
>
>  attr_reader :one, :two
>
>
>
> 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
Cab5e5dbfd348fe340735b6254f11361?d=identicon&s=25 Jeff Thorne (Guest)
on 2006-04-01 04:02
(Received via mailing list)
Patrick,

Thanks for the quick response. I agree that it doesn't make sense
unless I was passing the new value back to the block. I am about
15 minutes into the Picaxe and was just trying to get a handle on the
syntax. The language looks great. My brain is just hardwired with java
syntax at this point :-)

Cheers,
Jeff
2c51fec8183a5d21c4e11b430beabb47?d=identicon&s=25 Patrick Hurley (Guest)
on 2006-04-01 04:05
(Received via mailing list)
On 3/31/06, Patrick Hurley <phurley@gmail.com> wrote:
> >
> >
> >
> >
> >
> >
>   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
This topic is locked and can not be replied to.