From: Tom Werner Date: 2006-12-14T04:49:25+09:00 Subject: Re: assigning constant as an unbound dynamic method Scott Strattner wrote: > Looking at the examples in the book (p. 408 in 2nd edition), it appears > I can do a .instance_method(:) assignment, then bind > that to a particular object, and then run call. For instance (from > book): > > str = "cat" > ulen = String.instance_method(:length) > blen = ulen.bind(str) > blen.call -> 3 > > How I'd like to work that in my program is to define two constants > (within a class called Device), which correspond to the two > instance_methods: > > class Device > .... > GET = SMTP::Manager.instance_method(:get) > WALK = SMTP::Manager.instance_method(:walk) > > and then: > > def query_device(mibval,type=GET,mib=RFC1213) > data = [] > response = NOTSET > begin > SNMP::Manager.open(:Host => @ip.to_s, > :Community => @comm) do > |manager| > manager.load_module(mib) unless (mib == RFC1213) > mngr = type.bind(manager) > response = mngr.call(mibval) > end > rescue > etc..... > end > > But when I try running this, I get the following error: > > uninitialized constant Device::SMTP (NameError) > > It appears to be adding my class onto the method name. I do have the > necessary "require" in place (before I define the constants), and the > SNMP::Manager.open command worked fine (before I make changes to get > dynamic method calls to work). So I'm not sure why it's adding my class > name here but it doesn't try to do that under query_device. > Try prefixing with ::, that will get you back to the root scope: GET = ::SMTP::Manager.instance_method(:get) Tom