From: Mikkel Kroman on
Hello.

How do I perform something like this?
https://gist.github.com/6a2aa7e86cad8717541f

It's the @echo variable inside the block I'm talking about, how do I
gain "access" to it?

Sincerely,
phora.
--
Posted via http://www.ruby-forum.com/.

From: Robert Klemme on
2010/1/24 Mikkel Kroman <mk(a)maero.dk>:

> How do I perform something like this?
> https://gist.github.com/6a2aa7e86cad8717541f
>
> It's the @echo variable inside the block I'm talking about, how do I
> gain "access" to it?

This is not a class variable. It is an instance variable of @listen.

What kind of access do you need?

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

From: Charles Oliver Nutter on
Ruby doesn't scope quite like that normally, but you can do it using
instance_eval and define_method:

def initialize(server1, server2)
@echo = echo = IRC::Client.new(*server1)
@listen = IRC::Client.new(*server2)
@echo.instance_eval do
define_method :message_received do |nick, channel, message, *args|
if channel == "#Pre"
echo.puts("PRIVMSG #{echo.channel} :#{message}")
end
end
end
end

instance_eval has some quirks, and define_method methods are never as
fast as normal methods (since they have full block dispatch
semantics), but this should do what you need.

- Charlie

On Sun, Jan 24, 2010 at 3:13 AM, Mikkel Kroman <mk(a)maero.dk> wrote:
> Hello.
>
> How do I perform something like this?
> https://gist.github.com/6a2aa7e86cad8717541f
>
> It's the @echo variable inside the block I'm talking about, how do I
> gain "access" to it?
>
> Sincerely,
> phora.
> --
> Posted via http://www.ruby-forum.com/.
>
>

From: Robert Klemme on
2010/1/25 Charles Oliver Nutter <headius(a)headius.com>:
> Ruby doesn't scope quite like that normally, but you can do it using
> instance_eval and define_method:
>
> def initialize(server1, server2)
>  @echo = echo = IRC::Client.new(*server1)
>  @listen = IRC::Client.new(*server2)
>  @echo.instance_eval do
>    define_method :message_received do |nick, channel, message, *args|
>      if channel == "#Pre"
>        echo.puts("PRIVMSG #{echo.channel} :#{message}")
>      end
>    end
>  end
> end
>
> instance_eval has some quirks, and define_method methods are never as
> fast as normal methods (since they have full block dispatch
> semantics), but this should do what you need.

Unlikely, since the method was defined on @listen and not @echo. :-)
This is probably a better solution:

def initialize(server1, server2)
@echo = IRC::Client.new(*server1)
@listen = IRC::Client.new(*server2)

class <<@listen
attr_accessor :echo
end

@listen.echo = @echo

def @listen.message_received(nick, channel, message, *args)
if channel == "#Pre"
echo.puts("PRIVMSG #{echo.channel} :#{message}")
end
end
end

Kind regards

robert


--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

From: Mikkel Kroman on
Thanks to both of you, I've used both examples for several tasks.
--
Posted via http://www.ruby-forum.com/.