From: Patrik Sundberg Date: 2001-06-06T22:44:50+09:00 Subject: [ruby-talk:16265] odd obj.send behaviour hi, excuse me for the sourcelistings in this mail - i found it hard to explain without 'em. I have found a strange thing with Object#send in a little application I am writing. I can't really figure out what is wrong. Could be drb related. Here are the files: -- the drb server (rbobjgw.rb -- require 'drb' class RbObjGw undef :to_s undef :to_a undef :respond_to? undef :gets undef :getc attr_accessor :key def createObj(type, *args) obj = nil if args.empty? p type+".new" obj = eval(type+".new") else cmd = type+".new(*args)" obj = eval(cmd) end @key = type 8.times {|i| @key = @key + rand(9).to_s } $rbGwObjects[@key] = obj @key end def destroyObj $rbGwObjects.delete(@key) end def method_missing(methId, *args, &block) obj = $rbGwObjects[@key] if args.empty? if block.nil? obj.send(methId) else obj.send(methId, &block) end else if block.nil? obj.send(methId, *args) else obj.send(methId, *args, &block) end end end end $rbGwObjects = Hash.new DRb.start_service('druby://localhost:9000', RbObjGw.new) DRb.thread.join -- the local client handle object (rbobjhandle.rb) -- class RbObjGwHandle undef :to_s undef :to_a undef :respond_to? undef :gets undef :getc attr_reader :key, :gw def initialize(key, gw) @key = key @gw = gw end def method_missing(methId, *args, &block) print "key: #{@key} - gw: #{@gw} - id: #{methId}\n" @gw.key = @key if args.empty? if block.nil? @gw.send(methId) # see comments below listings else @gw.send(methId, &block) end else if block.nil? @gw.send(methId, *args) else @gw.send(methId, *args, &block) end end end end -- a small test -- require 'drb' require 'rbobjgwhandle' DRb.start_service factory = DRbObject.new(nil, 'druby://localhost:9000') io = RbObjGwHandle.new(factory.createObj("File", "/etc/passwd", "r"), factory) s = io.gets print "io: #{s}\n" io.close io.destroyObj -------------------- some methods defined in Kernel seems to not correctly propagate via method_missing. With the File class i have found that gets is such a method. If i undef it in the drb object i am fine though which seems correct. But when gets is sent to the drb object it isn't propagated via method_missing for some reason. in the RbObjGwHandle#method_missing method where I placed the comment gets just hangs. that is @gw.send(:gets) hangs, but if i change this to @gw.gets i am alright. anyone have an explanation for this? (please CC me since I am not on this list) -- -----------------------------------------------------------. Patrik Sundberg email: ps@raditex.se || ps@radiac.mine.nu | Phone: +46 13 178567 || +46 707 602240 | .---> UNIX consultant | |-----> Applied Physics and Electrical Engineering student | `----------------------------------------------------------'