带变量赋值的 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 nil
或 false
.
代码启动一个 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 整个文档读取。
带变量赋值的 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 nil
或 false
.
代码启动一个 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 整个文档读取。