带变量赋值的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行外,我什么都懂。一步一步地指导它是如何执行的,这将是非常有帮助的。
发布于 2015-09-01 01:28:57
赋值表达式有值。
line = socket.gets.split(' ', 2)将右手侧的值赋值给左手侧,然后将右手侧的值作为赋值表达式的值返回。
while line = socket.gets.split(' ', 2)以socket.gets.split(' ', 2)值作为条件。但是,在本例中,条件总是正确的,因为String#split永远不会返回nil或false。
发布于 2018-11-22 04:04:56
代码将触发监听端口4567的TCP服务器,侦听传入的通信量,当任何通信量进入时,它会撕开以字符串形式传入的标头,并将其映射到散列,然后根据特定标头的值读取传入的文档。
第5-10行细分如下:
headers = {}这会将头设置为主循环范围内的空白散列( la Hash.new),允许您将其设置为从下一行开始的时间内的值,然后在while退出后访问它。
while line = socket.gets.split(' ', 2) # Here is the var assignment in loop这将开始您的This循环。如果while条件的计算结果为true,则执行该块。如前所述,赋值的右边作为赋值表达式返回,这意味着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值与line[1].strip中包含的值相同的值。切碎和剥离是字符串清理的方法。
如果line设置为['foo','bar'],这将将{'foo' => 'bar'}合并到headers中。
end这将结束while循环。
data = socket.read(headers["Content-Length"].to_i)这将变量data设置为socket.read(integer)将返回的值。考虑到它是内容长度头,我假设它将返回由套接字读取的整个文档。
https://stackoverflow.com/questions/32322128
复制相似问题