接下来与if.在一个.each循环中?

Ear*_*rlz 25 ruby coding-style

我有一个文本处理的东西,我在Ruby中做.基本上,我必须实现一个简单的状态机(一个字符后视).

我的代码目前看起来像这样:

text.each{ |c|
  ...
  ...
  ...
  ...
  if @state!=:some_state
    next
  end
  #processing stuff for if in :some_state mode
  ...
  ...
  ...
  ...
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是对的吗?或者它应该像下面这样实现:

text.each{ |c|
  ...
  ...
  ...
  ...
  if @state==:some_state
    #processing stuff for if in :some_state mode
    ...
    ...
    ...
    ...
    ...
  end
}
Run Code Online (Sandbox Code Playgroud)

有正确的方式还是只是偏好?哪一个与做事的"红宝石方式"更加融合?

nas*_*nas 21

完全同意@DigitalRoss并且我看到人们在使用next一些条件被评估之后存在复杂的代码时使用

 next if @state!=:some_state
 # some long complicated code
Run Code Online (Sandbox Code Playgroud)

另一方面,如果有一个简单的操作需要根据某些条件进行,那么我更愿意

 if @state == :some_state
   #call_a_method_to_do_something
 end

 OR

 call_a_method if @state == :some_state
Run Code Online (Sandbox Code Playgroud)

话虽如此,编写冗长的复杂代码却是不好的做法.如果您的代码干净且设计良好,那么您将永远不必next在代码中使用.

  • 如果您可以使用`if`语句轻松地使用代码,那么仍然可以避免使用`next`.但是,如果你在一个方法中有50行代码,那么我认为你仍然应该仔细看看,因为代码可能做了太多的事情.尝试用不同的方法来抽象它的一部分.方法或函数应该很小,具有相同的抽象级别和单一责任,并且可以更改对象的状态或返回值. (2认同)
  • 为了清楚起见,我通常将我的`next if if predicate`用于块的开头. (2认同)

Mla*_*vić 5

我认为你给出的例子并没有真正反映出做出next改变的情况.考虑一下代码中有多个"next-points"的情况:

text.each do |c|
  next if @state == :state1
  ...
  next if @state == :state2
  ...
  next if @state == :state3
  ...
end
Run Code Online (Sandbox Code Playgroud)

并将其与if-variant进行比较:

text.each do |c|
  unless @state == :state1
    ...
    unless @state == :state2
      ...
      unless @state == :state3
        ...
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

虽然第一种可以被一些纯粹主义者视为意大利式风格,但恕我直言,它比后者更具可读性.