while循环与变量赋值

时间:2015-09-01 01:13:08

标签: ruby loops while-loop tcpserver

带有变量赋值的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号线以外的一切。只是一步一步指导如何执行它将非常有帮助。

2 个答案:

答案 0 :(得分:2)

赋值表达式具有值。

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

右侧的值分配到左侧,然后右侧的值将作为赋值表达式的值返回。

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

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

答案 1 :(得分:1)

该代码启动了侦听端口4567的TCP服务器,侦听传入的通信,当有任何通信进入时,它会撕裂似乎以字符串形式进入的标头并将其映射为哈希,然后读取根据特定标头的值输入的文档。

第5-10行细分:

headers = {}

这会将标头设置为主循环范围内的空白哈希(la Hash.new),允许您在下一行开始的while内将其设置为值,然后在while退出后进行访问。

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

这开始您的while循环。如果while条件的值为true,则执行该块。正如Yu所提到的,赋值的右侧作为赋值表达式的值返回,这意味着socket.gets.split(' ',2)的结果的真实性得到评估。这将始终评估为true。然后,将运算结果设置为line范围内的变量while

    break if line[0] == ""

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

相同
    headers[line[0].chop] = line[1].strip

假设上一行的计算结果不为true,则我们继续在headers哈希中设置键,无论该line[0].chop的值是否等于{{1 }}。 Chop和strip是字符串清理方法。

如果将line[1].strip设置为line,则会将['foo','bar']合并到{'foo' => 'bar'}中。

headers

这将结束end 循环。

while

这会将变量data = socket.read(headers["Content-Length"].to_i) 设置为data返回的值。鉴于它是内容长度标头,我假设它将返回套接字读取的整个文档。