Ruby 带变量赋值的While循环

Ruby 带变量赋值的While循环,ruby,loops,while-loop,tcpserver,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] ==

带变量赋值的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)
将右侧的值指定给左侧,然后将右侧的值作为赋值表达式的值返回

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

socket.gets.split(“”,2)
的值用作条件。但是,在本例中,该条件始终为真,因为它永远不会返回
nil
false

该代码启动侦听端口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.get.split(“”,2)
的结果进行真实性评估。这将始终计算为
true
。然后将操作结果设置为
while
范围内的变量

    break if line[0] == ""
如果
的第一个元素等于“”,我们将退出
while
循环。这与写入
中断if line.first.empty?

    headers[line[0].chop] = line[1].strip
如果前一行的计算结果不是true,我们将继续在
标题中设置键,无论
行[0]的值是多少,都将其命名为
哈希。chop
结果是
行[1]中包含的值。strip
。“斩”和“剥”是字符串清理方法

如果
被设置为
['foo','bar']
,这将把
{'foo'=>'bar'}
合并到
标题中

end
这将结束
while
循环

data = socket.read(headers["Content-Length"].to_i)

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

非常感谢,这部分解决了我的困惑。我在我的问题中添加了更多要详细说明的内容。谢谢你的回答,希望它能帮助其他有同样问题的人(我现在有点过了这个问题,但无论如何+1是一个好答案)。出于好奇,你是怎么发现这个问题的?我问这个问题已经三年了,在搜索Ruby测试中定义变量的语法和最佳实践时偶然发现了这个问题,发现它实际上没有得到回答。我想这只会帮助其他人在未来跌跌撞撞地穿过它。好吧,谢谢你的回答!我希望你留在这里(或其他任何人):)