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:incollect”:未定义的方法
零:零级(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,除非
是我经常看到的一个习惯用法,所以我觉得很多人都习惯了它。老实说,我从经验丰富的开发人员很少看到这些类型的布尔错误,这就是为什么我不认为它混淆。我尝试使用<代码>,除非我也是