gpt4 book ai didi

Ruby - 正确处理空对象

转载 作者:数据小太阳 更新时间:2023-10-29 08:52:44 26 4
gpt4 key购买 nike

在 ruby​​ 中,我不太确定如何处理对象是否为 nil。

例如我有以下内容:

begin
sp = SerialPort.new(@serial_device, @serial_bps, @serial_par, @serial_bits, SerialPort::NONE)
tcp = TCPSocket.new(@host, @port)

if (sp)
sp.print(command)
sp.close
elsif
tcp.print(command)
tcp.close
end

say siri_output
rescue
pp $!
puts "Sorry, I encountered an error: #{$!}"
ensure
request_completed
end

问题是第一个对象返回与以下相关的错误:

没有到主机的路由 - connect(2)

这是正确的,因为 TCP 未连接 duh。所以我希望它改用下一个对象。

有没有一种方法可以在不使用某些异常的情况下做到这一点,我想知道是否有更好的方法来做我想做的事情。

最佳答案

问题不在于支票,您做对了。在 ruby​​ 中,任何不是 nil 或 false 的都是 true。就是当您在以“sp = ..”开头的行上遇到异常时,执行会跳转到 resque block 。您应该像这样重构代码(我删除了 ensure 子句,因为我不知道它的作用)。这样做的一件好事是在它自己的行中拯救每个特定类型的异常。按类(class)名称前。 NoConnectivityException => e(或者异常的类别)。

 begin
sp = SerialPort.new(@serial_device, @serial_bps, @serial_par, @serial_bits, SerialPort::NONE)
sp.print(command)
sp.close
say siri_output
rescue Exception => e
puts "Sorry, I encountered an error: #{e.inspect}"
puts "trying TCP"
begin
tcp = TCPSocket.new(@host, @port)
tcp.print(command)
tcp.close
say siri_output
rescue Exception => e
puts "Sorry, I encountered an error: #{e.inspect}"
end
end

对于快速和草率的编程,您可以做另一件事,但不推荐这样做,而且通常调试起来很痛苦,因为任何错误都会导致 nil 并被静音。

sp = SerialPort.new(@serial_device, @serial_bps, @serial_par, @serial_bits, SerialPort::NONE) rescue nil
tcp = TCPSocket.new(@host, @port) rescue nil

这样你最终会在 sp 变量中得到一个 SerialPort 对象或 nil 对象,sp 也是如此。

关于Ruby - 正确处理空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860825/

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