首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有可变赋值的with循环

具有可变赋值的with循环
EN

Stack Overflow用户
提问于 2015-09-01 01:13:08
回答 2查看 3K关注 0票数 1

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

代码语言:javascript
运行
复制
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行外,我什么都懂。一步一步地指导它是如何执行的,这将是非常有帮助的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-01 01:28:57

赋值表达式有值。

代码语言:javascript
运行
复制
line = socket.gets.split(' ', 2)

将右手侧的值赋值给左手侧,然后将右手侧的值作为赋值表达式的值返回。

代码语言:javascript
运行
复制
while line = socket.gets.split(' ', 2)

socket.gets.split(' ', 2)值作为条件。但是,在本例中,条件总是正确的,因为String#split永远不会返回nilfalse

票数 2
EN

Stack Overflow用户

发布于 2018-11-22 04:04:56

代码将触发监听端口4567的TCP服务器,侦听传入的通信量,当任何通信量进入时,它会撕开以字符串形式传入的标头,并将其映射到散列,然后根据特定标头的值读取传入的文档。

第5-10行细分如下:

代码语言:javascript
运行
复制
headers = {}

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

代码语言:javascript
运行
复制
while line = socket.gets.split(' ', 2) # Here is the var assignment in loop

这将开始您的This循环。如果while条件的计算结果为true,则执行该块。如前所述,赋值的右边作为赋值表达式返回,这意味着socket.gets.split(' ',2)的结果是真实的。这将始终被计算为true。然后,将操作的结果设置为在line范围内的变量while

代码语言:javascript
运行
复制
    break if line[0] == ""

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

代码语言:javascript
运行
复制
    headers[line[0].chop] = line[1].strip

如果前面的行没有计算为true,我们将继续将headers散列中的键设置为line[0].chop值与line[1].strip中包含的值相同的值。切碎和剥离是字符串清理的方法。

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

代码语言:javascript
运行
复制
end

这将结束while循环。

代码语言:javascript
运行
复制
data = socket.read(headers["Content-Length"].to_i)

这将变量data设置为socket.read(integer)将返回的值。考虑到它是内容长度头,我假设它将返回由套接字读取的整个文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32322128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档