Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-退出IF块_Ruby_If Statement_Exit - Fatal编程技术网

Ruby-退出IF块

Ruby-退出IF块,ruby,if-statement,exit,Ruby,If Statement,Exit,在IF块中,我需要检查某些条件是否为真,如果为真,则从块中退出 #something like this if 1 == 1 return if some_object && some_object.property puts 'hello' end 我该怎么做呢?在选择与事物相关的词语时要小心。因为Ruby有块,我不确定您是否认为条件语句就是块。例如,您不能执行以下操作: # will NOT work: block = Proc.new { puts "Hello,

在IF块中,我需要检查某些条件是否为真,如果为真,则从块中退出

#something like this
if 1 == 1
  return if some_object && some_object.property
  puts 'hello'
end

我该怎么做呢?

在选择与事物相关的词语时要小心。因为Ruby有块,我不确定您是否认为条件语句就是块。例如,您不能执行以下操作:

# will NOT work:
block = Proc.new { puts "Hello, world." }
if true then block
如果需要一个嵌套的条件,您可以这样做,而不会使事情复杂化:

if condition_one?
  if condition_two?
    # do some stuff
  end
else
  # do something else
end

如果那样的话,你就无法摆脱
。您可以做的是在其中添加一个子条款:

if (cond1)
  unless (cond2)
    # ...
  end
end
如果您的逻辑嵌套太多,并且您需要一种更好地将其平坦化的方法,那么您可能想做的是先计算一个变量,然后在需要时才开始:

will_do_stuff = cond1
will_do_stuff &&= !(some_object && some_object.property)

if (will_do_stuff)
  # ...
end

有许多方法可以避免使用深度嵌套的结构,而不必
破坏它。

+1用于预先计算变量,从而为条件命名。一个好的名字将极大地提高可读性。我建议避免这种情况,并在需要时定义更多的方法。这是Rails使用的模式,它工作得非常好。将方法拆分为您可以使用的最原子的方法—在本例中,可以使用同一类/对象中的另一个(private?)方法来测试此条件。例如,
def将解析?(obj)!无&&obj.respond_to(:parse)和&obj.准备好了吗?;end
&&
是二进制的,与
|124;=
等价,因此
a&&=b
a&&a=b
相同。因此,如果
a
是真实的,那么
b
的值就被分配给
a
@coreward:定义方法当然是重构的一种方法,而让像
应该做什么?
这样的辅助方法代替一堆复杂的逻辑是一种很好的方法,但在这种情况下,不清楚有多少逻辑。这有点误导,因为如果您将第一个代码段的第二行更改为
,如果为true,则为block.call end
,那么它将work@DaveMongoose这是因为您正在对Proc实例调用“call”方法,但是感谢downvoteis,ruby中有一个反例,它是块,但可以替换为proc实例(比如
block
)?我认为语法要求它是
&block
,如果您使用它来代替显式块。