# Class variable inside block of defining instance method

**URL:** <https://www.ruby-forum.com/t/class-variable-inside-block-of-defining-instance-method/182174>\
**Category:** Ruby\
**Created:** [January 24, 2010, 3:12am UTC](https://www.ruby-forum.com/t/class-variable-inside-block-of-defining-instance-method/182174 "2010-01-24T03:12:15Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![nginxchina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f0a364/32.png) [@nginxchina](https://www.ruby-forum.com/u/nginxchina)\
**Post date:** [January 24, 2010, 3:12am UTC](https://www.ruby-forum.com/t/class-variable-inside-block-of-defining-instance-method/182174/1 "2010-01-24T03:12:15Z")

</div>

Hello.

How do I perform something like this?

> <https://gist.github.com/mkroman/6a2aa7e86cad8717541f>

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

Sincerely,  
phora.

---

<div class="post-metadata">

**Author:** ![nginxchina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f0a364/32.png) [@nginxchina](https://www.ruby-forum.com/u/nginxchina)\
**Post date:** [January 25, 2010, 1:00pm UTC](https://www.ruby-forum.com/t/class-variable-inside-block-of-defining-instance-method/182174/2 "2010-01-25T13:00:13Z")

</div>

2010/1/24 Mikkel K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> How do I perform something like this?  
> [gist:6a2aa7e86cad8717541f · GitHub](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

---

<div class="post-metadata">

**Author:** ![nginxchina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f0a364/32.png) [@nginxchina](https://www.ruby-forum.com/u/nginxchina)\
**Post date:** [January 25, 2010, 2:11pm UTC](https://www.ruby-forum.com/t/class-variable-inside-block-of-defining-instance-method/182174/3 "2010-01-25T14:11:03Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![nginxchina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f0a364/32.png) [@nginxchina](https://www.ruby-forum.com/u/nginxchina)\
**Post date:** [February 8, 2010, 2:38pm UTC](https://www.ruby-forum.com/t/class-variable-inside-block-of-defining-instance-method/182174/4 "2010-02-08T14:38:18Z")

</div>

Thanks to both of you, I’ve used both examples for several tasks.

---

<div class="post-metadata">

**Author:** ![nginxchina](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/f0a364/32.png) [@nginxchina](https://www.ruby-forum.com/u/nginxchina)\
**Post date:** [January 25, 2010, 2:53pm UTC](https://www.ruby-forum.com/t/class-variable-inside-block-of-defining-instance-method/182174/5 "2010-01-25T14:53:47Z")

</div>

2010/1/25 Charles Oliver N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> ```
> 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
