diff --git a/lib/rb/lib/thrift/client.rb b/lib/rb/lib/thrift/client.rb
index 1a34543..8f9b96a 100644
--- a/lib/rb/lib/thrift/client.rb
+++ b/lib/rb/lib/thrift/client.rb
@@ -23,7 +23,7 @@
       result = result_klass.new
       result.read(@iprot)
       @iprot.read_message_end
-      return result
+      result
     end
 
     def handle_exception(mtype)
diff --git a/lib/rb/lib/thrift/exceptions.rb b/lib/rb/lib/thrift/exceptions.rb
index eed0615..7bb9238 100644
--- a/lib/rb/lib/thrift/exceptions.rb
+++ b/lib/rb/lib/thrift/exceptions.rb
@@ -29,21 +29,13 @@
       iprot.read_struct_begin
       while true
         fname, ftype, fid = iprot.read_field_begin
-        if (ftype === Types::STOP)
+        if ftype == Types::STOP
           break
         end
-        if (fid == 1)
-          if (ftype === Types::STRING)
-            @message = iprot.read_string;
-          else
-            iprot.skip(ftype)
-          end
-        elsif (fid == 2)
-          if (ftype === Types::I32)
-            @type = iprot.read_i32;
-          else
-            iprot.skip(ftype)
-          end
+        if fid == 1 and ftype == Types::STRING
+          @message = iprot.read_string
+        elsif fid == 2 and ftype == Types::I32
+          @type = iprot.read_i32
         else
           iprot.skip(ftype)
         end
@@ -54,12 +46,12 @@
 
     def write(oprot)
       oprot.write_struct_begin('Thrift::ApplicationException')
-      if (@message != nil)
+      unless @message.nil?
         oprot.write_field_begin('message', Types::STRING, 1)
         oprot.write_string(@message)
         oprot.write_field_end
       end
-      if (@type != nil)
+      unless @type.nil?
         oprot.write_field_begin('type', Types::I32, 2)
         oprot.write_i32(@type)
         oprot.write_field_end
diff --git a/lib/rb/lib/thrift/processor.rb b/lib/rb/lib/thrift/processor.rb
index 92a9a40..a28d1ef 100644
--- a/lib/rb/lib/thrift/processor.rb
+++ b/lib/rb/lib/thrift/processor.rb
@@ -8,16 +8,16 @@
       name, type, seqid  = iprot.read_message_begin
       if respond_to?("process_#{name}")
         send("process_#{name}", seqid, iprot, oprot)
-        return true
+        true
       else
         iprot.skip(Types::STRUCT)
         iprot.read_message_end
         x = ApplicationException.new(ApplicationException::UNKNOWN_METHOD, 'Unknown function '+name)
         oprot.write_message_begin(name, MessageTypes::EXCEPTION, seqid)
-          x.write(oprot)
+        x.write(oprot)
         oprot.write_message_end
         oprot.trans.flush
-        return
+        false
       end
     end
 
diff --git a/lib/rb/lib/thrift/protocol.rb b/lib/rb/lib/thrift/protocol.rb
index b514381..d28ae51 100644
--- a/lib/rb/lib/thrift/protocol.rb
+++ b/lib/rb/lib/thrift/protocol.rb
@@ -206,48 +206,46 @@
     end
 
     def skip(type)
-      if type === Types::STOP
+      case type
+      when Types::STOP
         nil
-      elsif type === Types::BOOL
+      when Types::BOOL
         read_bool
-      elsif type === Types::BYTE
+      when Types::BYTE
         read_byte
-      elsif type === Types::I16
+      when Types::I16
         read_i16
-      elsif type === Types::I32
+      when Types::I32
         read_i32
-      elsif type === Types::I64
+      when Types::I64
         read_i64
-      elsif type === Types::DOUBLE
+      when Types::DOUBLE
         read_double
-      elsif type === Types::STRING
+      when Types::STRING
         read_string
-      elsif type === Types::STRUCT
+      when Types::STRUCT
         read_struct_begin
         while true
           name, type, id = read_field_begin
-          if type === Types::STOP
-            break
-          else
-            skip(type)
-            read_field_end
-          end
-        end  
+          break if type == Types::STOP
+          skip(type)
+          read_field_end
+        end
         read_struct_end
-      elsif type === Types::MAP
+      when Types::MAP
         ktype, vtype, size = read_map_begin
         size.times do
           skip(ktype)
           skip(vtype)
         end
         read_map_end
-      elsif type === Types::SET
+      when Types::SET
         etype, size = read_set_begin
         size.times do
           skip(etype)
         end
         read_set_end
-      elsif type === Types::LIST
+      when Types::LIST
         etype, size = read_list_begin
         size.times do
           skip(etype)
diff --git a/lib/rb/lib/thrift/protocol/binaryprotocol.rb b/lib/rb/lib/thrift/protocol/binaryprotocol.rb
index 9339b94..b6f1ada 100644
--- a/lib/rb/lib/thrift/protocol/binaryprotocol.rb
+++ b/lib/rb/lib/thrift/protocol/binaryprotocol.rb
@@ -46,15 +46,11 @@
     end
 
     def write_bool(bool)
-      if (bool)
-        write_byte(1)
-      else
-        write_byte(0)
-      end
+      write_byte(bool ? 1 : 0)
     end
 
     def write_byte(byte)
-      trans.write([byte].pack('n')[1..1])
+      trans.write([byte].pack('c'))
     end
 
     def write_i16(i16)
@@ -88,40 +84,41 @@
       type = version & 0x000000ff
       name = read_string
       seqid = read_i32
-      return name, type, seqid
+      [name, type, seqid]
     end
 
     def read_field_begin
       type = read_byte
-      if (type === Types::STOP)
-        return nil, type, 0
+      if (type == Types::STOP)
+        [nil, type, 0]
+      else
+        id = read_i16
+        [nil, type, id]
       end
-      id = read_i16
-      return nil, type, id
     end
 
     def read_map_begin
       ktype = read_byte
       vtype = read_byte
       size = read_i32
-      return ktype, vtype, size
+      [ktype, vtype, size]
     end
 
     def read_list_begin
       etype = read_byte
       size = read_i32
-      return etype, size
+      [etype, size]
     end
 
     def read_set_begin
       etype = read_byte
       size = read_i32
-      return etype, size
+      [etype, size]
     end
 
     def read_bool
       byte = read_byte
-      return byte != 0
+      byte != 0
     end
 
     def read_byte
@@ -130,7 +127,7 @@
       if (val > 0x7f)
         val = 0 - ((val - 1) ^ 0xff)
       end
-      return val
+      val
     end
 
     def read_i16
@@ -139,7 +136,7 @@
       if (val > 0x7fff)
         val = 0 - ((val - 1) ^ 0xffff)
       end
-      return val
+      val
     end
 
     def read_i32
@@ -148,31 +145,31 @@
       if (val > 0x7fffffff)
         val = 0 - ((val - 1) ^ 0xffffffff)
       end
-      return val
+      val
     end
 
     def read_i64
       dat = trans.read_all(8)
       hi, lo = dat.unpack('N2')
       if (hi > 0x7fffffff)
-        hi = hi ^ 0xffffffff
-        lo = lo ^ 0xffffffff
-        return 0 - hi*4294967296 - lo - 1
+        hi ^= 0xffffffff
+        lo ^= 0xffffffff
+        0 - (hi << 32) - lo - 1
       else
-        return hi*4294967296 + lo
+        (hi << 32) + lo
       end
     end
 
     def read_double
       dat = trans.read_all(8)
-      val, = dat.unpack('G')
-      return val
+      val = dat.unpack('G').first
+      val
     end
 
     def read_string
       sz = read_i32
       dat = trans.read_all(sz)
-      return dat
+      dat
     end
 
   end
diff --git a/lib/rb/lib/thrift/server.rb b/lib/rb/lib/thrift/server.rb
index 8dde80d..5d179ef 100644
--- a/lib/rb/lib/thrift/server.rb
+++ b/lib/rb/lib/thrift/server.rb
@@ -31,16 +31,15 @@
     def serve
       begin
         @serverTransport.listen
-        while (true)
+        loop do
           client = @serverTransport.accept
           trans = @transportFactory.get_transport(client)
           prot = @protocolFactory.get_protocol(trans)
           begin
-            while (true)
+            loop do
               @processor.process(prot, prot)
             end
-          rescue Thrift::TransportException, Thrift::ProtocolException => ttx
-            #print ttx,"\n"
+          rescue Thrift::TransportException, Thrift::ProtocolException
           ensure
             trans.close
           end
@@ -64,16 +63,16 @@
     def serve
       begin
         @serverTransport.listen
-        while (true)
+        loop do
           client = @serverTransport.accept
           trans = @transportFactory.get_transport(client)
           prot = @protocolFactory.get_protocol(trans)
           Thread.new(prot, trans) do |p, t|
             begin
-              while (true)
+              loop do
                 @processor.process(p, p)
               end
-            rescue Thrift::TransportException, Thrift::ProtocolException => e
+            rescue Thrift::TransportException, Thrift::ProtocolException
             ensure
               t.close
             end
@@ -109,16 +108,16 @@
       @serverTransport.listen
 
       begin
-        while (true)
+        loop do
           @thread_q.push(:token)
           Thread.new do
             begin
-              while (true)
+              loop do
                 client = @serverTransport.accept
                 trans = @transportFactory.get_transport(client)
                 prot = @protocolFactory.get_protocol(trans)
                 begin
-                  while (true)
+                  loop do
                     @processor.process(prot, prot)
                   end
                 rescue Thrift::TransportException, Thrift::ProtocolException => e
diff --git a/lib/rb/lib/thrift/server/httpserver.rb b/lib/rb/lib/thrift/server/httpserver.rb
index 8763e4c..7f2fbbf 100644
--- a/lib/rb/lib/thrift/server/httpserver.rb
+++ b/lib/rb/lib/thrift/server/httpserver.rb
@@ -14,15 +14,15 @@
       end
 
       def process(request, response)
-        unless request.params["REQUEST_METHOD"] == "POST"
-          response.start(404) { } # better way?
-          return
-        end
-        response.start(200) do |head, out|
-          head["Content-Type"] = "application/x-thrift"
-          transport = IOStreamTransport.new request.body, out
-          protocol = @protocol_factory.get_protocol transport
-          @processor.process protocol, protocol
+        if request.params["REQUEST_METHOD"] == "POST"
+          response.start(200) do |head, out|
+            head["Content-Type"] = "application/x-thrift"
+            transport = IOStreamTransport.new request.body, out
+            protocol = @protocol_factory.get_protocol transport
+            @processor.process protocol, protocol
+          end
+        else
+          response.start(404) { }
         end
       end
     end
diff --git a/lib/rb/lib/thrift/struct.rb b/lib/rb/lib/thrift/struct.rb
index 5a782ca..30f99cb 100644
--- a/lib/rb/lib/thrift/struct.rb
+++ b/lib/rb/lib/thrift/struct.rb
@@ -22,7 +22,7 @@
       iprot.read_struct_begin
       loop do
         fname, ftype, fid = iprot.read_field_begin
-        break if (ftype === Types::STOP)
+        break if (ftype == Types::STOP)
         handle_message(iprot, fid, ftype)
         iprot.read_field_end
       end
@@ -32,7 +32,7 @@
     def write(oprot)
       oprot.write_struct_begin(self.class.name)
       each_field do |fid, type, name|
-        if ((value = instance_variable_get("@#{name}")) != nil)
+        unless (value = instance_variable_get("@#{name}")).nil?
           if is_container? type
             oprot.write_field_begin(name, type, fid)
             write_container(oprot, value, struct_fields[fid])
@@ -58,7 +58,7 @@
 
     def handle_message(iprot, fid, ftype)
       field = struct_fields[fid]
-      if field && field[:type] == ftype
+      if field and field[:type] == ftype
         value = read_field(iprot, field)
         instance_variable_set("@#{field[:name]}", value)
       else
@@ -67,10 +67,11 @@
     end
 
     def read_field(iprot, field = {})
-      if field[:type] == Types::STRUCT
+      case field[:type]
+      when Types::STRUCT
         value = field[:class].new
         value.read(iprot)
-      elsif field[:type] == Types::MAP
+      when Types::MAP
         key_type, val_type, size = iprot.read_map_begin
         value = {}
         size.times do
@@ -79,13 +80,13 @@
           value[k] = v
         end
         iprot.read_map_end
-      elsif field[:type] == Types::LIST
+      when Types::LIST
         e_type, size = iprot.read_list_begin
         value = Array.new(size) do |n|
           read_field(iprot, field_info(field[:element]))
         end
         iprot.read_list_end
-      elsif field[:type] == Types::SET
+      when Types::SET
         e_type, size = iprot.read_set_begin
         value = Set.new
         size.times do
@@ -108,20 +109,21 @@
     end
 
     def write_container(oprot, value, field = {})
-      if field[:type] == Types::MAP
+      case field[:type]
+      when Types::MAP
         oprot.write_map_begin(field[:key][:type], field[:value][:type], value.size)
         value.each do |k, v|
           write_data(oprot, k, field[:key])
           write_data(oprot, v, field[:value])
         end
         oprot.write_map_end
-      elsif field[:type] == Types::LIST
+      when Types::LIST
         oprot.write_list_begin(field[:element][:type], value.size)
         value.each do |elem|
           write_data(oprot, elem, field[:element])
         end
         oprot.write_list_end
-      elsif field[:type] == Types::SET
+      when Types::SET
         oprot.write_set_begin(field[:element][:type], value.size)
         value.each do |v,| # the , is to preserve compatibility with the old Hash-style sets
           write_data(oprot, v, field[:element])
diff --git a/lib/rb/lib/thrift/transport.rb b/lib/rb/lib/thrift/transport.rb
index 439740d..7dd663a 100644
--- a/lib/rb/lib/thrift/transport.rb
+++ b/lib/rb/lib/thrift/transport.rb
@@ -38,16 +38,14 @@
     def read(sz); end
 
     def read_all(size)
-      buff = ''
-      have = 0
+      buf = ''
     
-      while (have < size)
-        chunk = read(size - have)
-        have += chunk.length
-        buff << chunk
+      while (buf.length < size)
+        chunk = read(size - buf.length)
+        buf << chunk
       end
     
-      buff
+      buf
     end
     deprecate! :readAll => :read_all
   
@@ -137,41 +135,22 @@
     end
 
     def read(sz)
-      if !@read
-        return @transport.read(sz)
-      end
+      return @transport.read(sz) unless @read
 
-      if (sz <= 0)
-        return ''
-      end
+      return '' if sz <= 0
 
-      if (@rbuf.length == 0)
-        read_frame
-      end
+      read_frame if @rbuf.empty?
 
       # return full buf
-      if (sz > @rbuf.length)
-        out = @rbuf
-        @rbuf = ''
-        return out
-      end
-
-      # Return substr
-      out = @rbuf.slice(0, sz)
-      @rbuf = @rbuf.slice(sz, @rbuf.length)
-      return out
+      out = @rbuf.slice(0...sz)
+      @rbuf = @rbuf.slice(sz..-1) || ''
+      out
     end
 
     def write(buf,sz=nil)
-      if !@write
-        return @transport.write(buf);
-      end
+      return @transport.write(buf) unless @write
 
-      if (sz != nil && sz < buf.length)
-        buf = buf.slice(0,sz)
-      end
-
-      @wbuf << buf
+      @wbuf << (sz ? buf[0...sz] : buf)
     end
 
     #
@@ -179,9 +158,7 @@
     # followed by the actual data.
     #
     def flush
-      if !@write
-        return @transport.flush
-      end
+      return @transport.flush unless @write
 
       out = [@wbuf.length].pack('N')
       out << @wbuf
@@ -193,9 +170,7 @@
     private
 
     def read_frame
-      buf  = @transport.read_all(4)
-      val  = buf.unpack('N')
-      sz   = val[0]
+      sz = @transport.read_all(4).unpack('N').first
 
       @rbuf = @transport.read_all(sz)
     end
