带有变量赋值的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号线以外的一切。只是一步一步指导如何执行它将非常有帮助。
答案 0 :(得分:2)
赋值表达式具有值。
line = socket.gets.split(' ', 2)
右侧的值分配到左侧,然后右侧的值将作为赋值表达式的值返回。
while line = socket.gets.split(' ', 2)
socket.gets.split(' ', 2)
的值用作条件。但是,在此示例中,条件始终为true,因为String#split
永远不会返回nil
或false
。
答案 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
返回的值。鉴于它是内容长度标头,我假设它将返回套接字读取的整个文档。