gpt4 book ai didi

ruby - TCPSocket#each 在 ruby​​ 中迭代什么?

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:54 24 4
gpt4 key购买 nike

我对 Ruby 不是很熟悉,所以找不到这个方法的文档。

像这样在 TCPSocket 对象上调用 each 时

require "socket"

srv = TCPServer.new("localhost", 7887)
skt = srv.accept
skt.each {|arg| p arg}

该 block 是否每个 tcp 数据包调用一次,每行调用一次(在每个 '\n' 字符之后),每个字符串调用一次(在每个 NUL/EOF 之后),还是完全不同的东西?

最佳答案

TL;DR TCPSocket.each 将迭代它接收到的每个换行符分隔的 \n 字符串。

更多详情:

TCPSocket 只是一个BasicSocket,上面有一些额外的糖粉。 BasicSocketIO 的子项类(class)。 IO 类只是一个数据流;因此,它是可迭代的。和 that is where您可以找到 each 是如何为 TCPSocket 定义的。

启动 irb 控制台并使用 $stdin 套接字输入您的代码行以查看 each 的行为。它们都继承自 IO。这是发生的情况的示例:

irb(main):011:0> $stdin.each {|arg| p arg + "."}
hello
"hello\n."

但要直接回答问题,每个 \n 字符都会调用一次该 block 。如果您的客户端一次发送 1 个字符的数据,那么在它看到 \n 之前不会执行该 block 。

这是一个快速示例客户端来展示这一点:

irb(main):001:0> require 'socket'
=> true
irb(main):002:0> s = TCPSocket.open("localhost", 7887)
=> #<TCPSocket:fd 9>
irb(main):003:0> s.puts "hello"
=> nil
irb(main):007:0> s.write "hi"
=> 2
irb(main):008:0> s.write ", nice to meet you"
=> 18
irb(main):009:0> s.write "\n"
=> 1

这是服务器打印出来的内容:

"hello\n"
"hi, nice to meet you\n" # note: this did not print until I sent "\n"

关于ruby - TCPSocket#each 在 ruby​​ 中迭代什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34661134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com