带变量赋值的 while 循环

While loop with variable assignment

带变量赋值的 while 循环如何工作?这是我看到的一个例子。

require "socket"
server = TCPServer.new('localhost', 4567)
loop do
    socket = server.accept
    headers = {}
    while line = socket.gets.split(' ', 2) # Here is the var assignment in loop
        break if line[0] == ""
        headers[line[0].chop] = line[1].strip
    end
    data = socket.read(headers["Content-Length"].to_i)
end

除了第 5-10 行外,我什么都懂。一步一步地指导如何执行它会非常有帮助。

赋值表达式有值。

line = socket.gets.split(' ', 2)

将右边的值赋给左边,然后return将右边的值作为赋值表达式的值

while line = socket.gets.split(' ', 2)

socket.gets.split(' ', 2)的值作为条件。但是,在此示例中,条件始终为真,因为 String#split 永远不会 return nilfalse.

代码启动一个 TCP 服务器监听端口 4567,监听传入流量,当任何流量传入时,它会撕裂似乎作为字符串传入的 headers 并将它们映射出来到散列,然后它根据特定 header.

的值读取传入的文档

第 5-10 行细分:

headers = {}

这会将 headers 设置为主循环范围内的空白散列(a la Hash.new),允许您在下一行开始的 while 内将其设置为一个值然后在 while 退出后访问它。

while line = socket.gets.split(' ', 2) # Here is the var assignment in loop

这将开始您的 while 循环。如果 while 条件的计算结果为 true,则执行该块。正如 Yu 提到的,赋值的右侧被 returned 作为赋值表达式的值,这意味着 socket.gets.split(' ',2) 的结果被评估为真值。这将始终评估为 true。然后将运算结果设置到while.

范围内的变量line
    break if line[0] == ""

如果line的第一个元素等于"",我们将退出while循环。这和写 break if line.first.empty?

是一样的
    headers[line[0].chop] = line[1].strip

如果上一行的计算结果不为真,我们将继续在 headers 哈希中设置密钥,无论 line[0].chop 的值结果是 line[1].strip。 Chop 和 strip 是字符串清理方法。

如果 line 已设置为 ['foo','bar'],这会将 {'foo' => 'bar'} 合并到 headers

end

这将结束 while 循环。

data = socket.read(headers["Content-Length"].to_i)

这会将变量 data 设置为 socket.read(integer) 会 return 的值。鉴于它的内容长度 header,我假设套接字将 return 整个文档读取。