Ruby-正确处理空对象

Ruby-正确处理空对象,ruby,exception,object,Ruby,Exception,Object,在ruby中,我不太确定如何处理对象是否为零 例如,我有以下几点: 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

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

例如,我有以下几点:

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
问题是第一个对象返回一个与以下内容相关的错误:

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

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


有没有一种方法可以在不使用某些异常的情况下执行此操作,我想知道是否有更好的方法来执行我所追求的任何操作。

问题不在于检查,你做得对。任何不是零或假的东西在ruby中都是真的。当您在以“sp=…”开头的行上获得异常时,执行跳转到resque块。您应该像这样重新构造代码(我删除了surever子句,因为我不知道它做什么)。这样做的一件好事是在它自己的行中拯救每一种特定类型的异常。按类名,例如NoConnectivityException=>e(或异常的类是什么)

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

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也是如此。

难道您不能使用函数检查该对象的可用性,然后建立连接吗?obj.nil?-ruby检查对象是否为nil
的方法确保
的结构与Java或C#中的类似。是的,我知道。我只是不明白这个条款在这里有什么意义,如果你有一个拯救所有例外,那么你可以把它放在整个开始/拯救的事情之外。只有当您重新引用异常或某些异常可能会漏掉时,才需要这样做。另外,“请求_完成”是做什么的?网络设备是如何连接到“siri_输出”的。
sp = SerialPort.new(@serial_device, @serial_bps, @serial_par, @serial_bits, SerialPort::NONE) rescue nil
tcp = TCPSocket.new(@host, @port) rescue nil