【问题标题】:Call next for outer loop from within a method从方法中调用 next for 外部循环
【发布时间】:2015-06-28 10:01:26
【问题描述】:

是否可以从外部循环的方法中调用 next:

bot.rb

while Option.daemon_active?(daemon: "bot")
  .....
  Trade.market_order
  ....
end

trade.rb

class Trade
  def self.market_order
     ... complex code ...
     response = exchange.market_sell
     next if response["state"] == false # This fails. This should start new iteration of while in bot.rb
  end
end

有一个非常相似的问题,但似乎不适合我:call next on ruby loop from external method

【问题讨论】:

  • while 块中的next unless Trade.market_order 有什么问题?
  • 同意@mudasobwa 不应该通过Trade 控制Bot,这根本不是它的责任,并且增加了通常应该避免的耦合(难以遵循执行路径,难以重构, Trade 可能会在 Bot 更改等情况下中断)
  • 谢谢@mudasobwa。很好的评论,虽然现在市场订单比我在这里显示的要复杂得多,但有很多检查,所有这些都需要在某个时候调用 next。也许我需要简化它
  • return false 任何你需要下一次迭代的地方,或者使用@sawa 的方法和catch

标签: ruby loops next


【解决方案1】:

是的。你应该使用throwcatch

bot.rb

while Option.daemon_active?(daemon: "bot")
  catch(:foo) do
    ...
    Trade.market_order
    ...
  end
end

trade.rb

class Trade
  def self.market_order
    ...
    response = exchange.market_sell
    throw :foo if response["state"] == false
  end
end

【讨论】:

  • 看来你设计过度了。 response["state"] ? response : nil 作为来自 market_ordernext unless market_order 的返回值,以一种更易读的方式来解决问题。
  • @mudasobwa 这不等同于 OP 的代码。 falsenil 是不同的。
  • 偶尔会这样。我的天啊。 response["state"] != false ? response : false.
  • next unless market_order 可能有效,但这不是 OP 所要求的。我同意你的看法,这可能是一个 XY 问题。
  • 这正是 OP 所要求的。此外,这正是您的代码所做的。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多