Prev: search datetime column for all records that start at 11:00
Next: Is there a way to list the classes defined in a module?
From: Mikkel Kroman on 23 Jan 2010 21:13 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 25 Jan 2010 05:12 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 25 Jan 2010 08:10 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 25 Jan 2010 08:52 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 8 Feb 2010 08:38
Thanks to both of you, I've used both examples for several tasks. -- Posted via http://www.ruby-forum.com/. |