I'm going to assume you really misunderstand and aren't trolling, because even if you are trolling, maybe this explanation will come in useful for someone else. Chris Reay wrote: > if select([@sock], [], [], 0.1) > @sock.recv() > etc, etc. > > Your program is asking the "recv" block to be called if select() > returns true. Actually no. In Ruby, as I showed in my previous message, "if _____" doesn't test to see if "_____" is true or false, it check to see if it is true, false, nil, or another object. If _____ is false, then the conditional is not executed. If _____ is nil, then the conditional is executed. Otherwise, whether _____ is the boolean 'true' or whether it is any other non-nil, non-false object, the conditional is executed. Conditional execution truth table: parameter | conditional executed ------------------------------------ false | no true | yes nil | no anything else | yes And note, that 'anything else' includes some things that may surprise people used to programming in C, including the number 0, an empty string, an empty array, etc. What I'm asking Ruby to do, is to execute that bit of code if the result of calling select() is not nil. > We have established the following: > > (a) select() returns nil or anArray (from a RTFM). > (b) nil != true (axiom). Right > (c) anArray != true. (See your irb snippet above). Right, however anArray = [] if anArray puts "This is printed because anArray is non-nil and not false" else puts "This is not printed." end > Thus you are requesting the block never to be called. Your program is > working perfectly, and the socket is brimming with bytes :) I'm confused by your talking about the block. There is a block in that bit of code, but it isn't inside the conditional. In this section of code: if select([@sock], [], [], 0.1) retval += @sock.recv(256) if stop_pattern if retval =~ stop_pattern break end end end This bit: retval += @sock.recv(256) if stop_pattern if retval =~ stop_pattern break end end Will get executed if "select([@sock], [], [], 0.1)" returns something which isn't nil, and isn't the boolean 'false'. The documentation of 'select' says that it returns nil, or an array. If it returns an array, that > Try this (and pardon my ruby, I've forgotten most of the syntax): > > while true > sockArr = select([@sock], [], [], 0.1) > if !sockArr.nil? and sockArr.at(0).include?(@sock) > @sock.recv(256) > etc, etc. That code will work, but, as I explained above, it isn't really necessary. Since the only possible non-nil return value of "select([@sock], [], [], 0.1)" is a set of arrays including "@sock". I don't really need to look at the return value. I know that if select() returns non-nil, my socket will not block if I try to read it. I hope that convinces you. If not, try playing around with if, and select() and see if you can figure out what I'm talking about. I think this does point out a need in Ruby for a 'to_bool' operator. Obviously, this kind of test already happens behind the scenes when it comes to conditionals. All you'd need is the equivalent of: class Object def to_bool true end end class NilClass def to_bool false end end class TrueClass def to_bool true end end class FalseClass def to_bool false end end If nothing else, this would help explain to people why "if 0" takes the 'true' branch. Just point out that 0.to_bool is true Any opinions? Should I make an RCR? Ben