Ruby:在return语句中使用除非关键字

Ruby:在return语句中使用除非关键字,ruby,Ruby,我目前正在从事一个项目,其中的代码如下所示: # the first return is the one causing problems def collect return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]] unless @ident_a_node.nil? and @id.nil? return Hash["IdentANode", @id] unless @id.nil? en

我目前正在从事一个项目,其中的代码如下所示:

  # the first return is the one causing problems
  def collect
    return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]] unless @ident_a_node.nil? and @id.nil?
    return Hash["IdentANode", @id] unless @id.nil?
  end
其中,我使用除非运算符有条件地执行return语句。出于某种原因,即使
@ident_a_node
nil
,此代码仍会执行。执行时,我收到以下消息:

identano.rb:14:in
collect”:未定义的方法
零:零级(NoMethodError)

这让我很困惑,因为我认为除非关键字会阻止这种情况发生。当我将声明更改为此表单时:

if not @ident_a_node.nil? and not @id.nil?
  return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]]
end  
return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]] if not @ident_a_node.nil? and not @id.nil?
或本表格:

if not @ident_a_node.nil? and not @id.nil?
  return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]]
end  
return Hash["IdentANode", Array[@id, ",", @ident_a_node.collect]] if not @ident_a_node.nil? and not @id.nil?
return语句未执行,会给出什么结果?为什么这两种说法有区别?除非
关键字出现多个条件,否则是否会导致问题


任何想法都将受到欢迎

除非与和/或一起使用,否则不要使用,这很容易混淆<代码>除非@ident_a_node.nil?而@id.nil?表示
if!(@ident_a_node.nil?和@id.nil?
,这意味着只要两个实例变量之一不是nil,它就会返回

if !(@ident_a_node.nil? and @id.nil?)

if !@ident_a_node.nil? or !@id.nil?
这应该更清楚,为什么它与

if not @ident_a_node.nil? and not @id.nil?

除非与和/或一起使用,否则不要使用,这很容易混淆<代码>除非@ident_a_node.nil?而@id.nil?表示
if!(@ident_a_node.nil?和@id.nil?
,这意味着只要两个实例变量之一不是nil,它就会返回

if !(@ident_a_node.nil? and @id.nil?)

if !@ident_a_node.nil? or !@id.nil?
这应该更清楚,为什么它与

if not @ident_a_node.nil? and not @id.nil?

你的逻辑有问题。您正在测试它们是否都为
nil
,以避免在您应该测试其中一个是否为
nil
时运行它。你可能因为有太多的否定层次而陷入这种境地。任何超过一个的都是不可接受的

换言之,您可以使用“如果没有下雨”,但不应该使用“除非
正在下雨
标志未设置为false的倒数”之类的内容

我个人的观点是,除非明显存在拖尾条件,否则不应使用拖尾条件。正如您在示例中所看到的,您必须水平滚动以查找条件,从而对开发人员隐藏重要信息

作为一种风格,在
时不要使用
而不是
将执行相同的工作。其次,当您可能只需要某种定义的值时,您专门针对
nil
进行测试

其他问题包括使用
Hash[]
Array[]
,这当然是使用需要它们的语言的产物。Ruby与JavaScript一样,允许分别使用
{}
[]
隐式声明这些内容

正确的Ruby风格的代码版本是:

if (@ident_a_node and @id)
  return { "IdentANode" => [ @id, ",", @ident_a_node.collect ] }
end  

你的逻辑有问题。您正在测试它们是否都为
nil
,以避免在您应该测试其中一个是否为
nil
时运行它。你可能因为有太多的否定层次而陷入这种境地。任何超过一个的都是不可接受的

换言之,您可以使用“如果没有下雨”,但不应该使用“除非
正在下雨
标志未设置为false的倒数”之类的内容

我个人的观点是,除非明显存在拖尾条件,否则不应使用拖尾条件。正如您在示例中所看到的,您必须水平滚动以查找条件,从而对开发人员隐藏重要信息

作为一种风格,在
时不要使用
而不是
将执行相同的工作。其次,当您可能只需要某种定义的值时,您专门针对
nil
进行测试

其他问题包括使用
Hash[]
Array[]
,这当然是使用需要它们的语言的产物。Ruby与JavaScript一样,允许分别使用
{}
[]
隐式声明这些内容

正确的Ruby风格的代码版本是:

if (@ident_a_node and @id)
  return { "IdentANode" => [ @id, ",", @ident_a_node.collect ] }
end  

出于某种原因,我期待这样的翻译:
if!第一个条件和条件!第二个条件
非常感谢much@Hunter:当谈到合取和析取的否定时,它们是非常有用的。@NiklasB。考虑到OPS类型的错误是非常常见的一个错误,我会认为它很混乱,以避免:)没有理由,为什么我们必须在我们看到摩根,除非使用和/或。在这里使用除非也没有好处。@dominik:
除非允许您用简单的英语表达您的条件。此外,
return,除非
是我经常看到的一个习惯用法,所以我觉得很多人都习惯了它。老实说,我从经验丰富的开发人员很少看到这些类型的布尔错误,这就是为什么我不认为它混淆。我尝试使用<代码>,除非但是,同样的问题仍然存在<代码>除非
很棘手。出于某种原因,我期待这样的翻译:
如果!第一个条件和条件!第二个条件
非常感谢much@Hunter:当谈到合取和析取的否定时,它们是非常有用的。@NiklasB。考虑到OPS类型的错误是非常常见的一个错误,我会认为它很混乱,以避免:)没有理由,为什么我们必须在我们看到摩根,除非使用和/或。在这里使用除非也没有好处。@dominik:
除非允许您用简单的英语表达您的条件。此外,
return,除非
是我经常看到的一个习惯用法,所以我觉得很多人都习惯了它。老实说,我从经验丰富的开发人员很少看到这些类型的布尔错误,这就是为什么我不认为它混淆。我尝试使用<代码>,除非我也是