Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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循环的下一步_Ruby - Fatal编程技术网

从外部方法调用ruby循环的下一步

从外部方法调用ruby循环的下一步,ruby,Ruby,在Ruby中,很容易告诉loop转到下一项 (1..10).each do |a| next if a.even? puts a end 结果=> 1 3 5 7 9 但是如果我需要从循环外部调用next(例如:method),该怎么办 我找到的唯一有效的解决办法就是像上面提到的那样使用throw&catch 我的问题是:有谁有更漂亮的解决方案来做到这一点吗??或者抛出/捕获是唯一的方法吗 另外,如果我想调用我的\u complex\u方法而不仅仅是作为循环的一部分(=>不要抛

在Ruby中,很容易告诉loop转到下一项

(1..10).each do |a|
  next if a.even?
  puts a
end
结果=>

1
3   
5
7
9
但是如果我需要从循环外部调用next(例如:method),该怎么办

我找到的唯一有效的解决办法就是像上面提到的那样使用
throw
&
catch

我的问题是:有谁有更漂亮的解决方案来做到这一点吗??或者
抛出/捕获
是唯一的方法吗


另外,如果我想调用
我的\u complex\u方法
而不仅仅是作为循环的一部分(=>不要抛出:skip),我能告诉我的方法它是从循环调用的吗?

你的complex方法可以返回一个布尔值,然后在循环上进行如下比较:

def my_complex_method(item)
  true if item.even? 
end

(1..10).each do |a|
  next if my_complex_method(a)
  puts a
end
一种简单的方法,但不同于try-catch方法

更新

由于
item.event?
已返回布尔值,因此不需要
true if item.event?
部分,您可以执行以下操作:

def my_complex_method(item)
  item.even? 
end
而且是goo的好选择:

def my_complex_method(e)
  return if e.peek.even? 
  p e.peek
end
enum = (1..5).each
enum.size.times do |a|
  my_complex_method(enum)
  enum.next
end
输出

1
3
5

如果您只需要对其中一些值采取操作,则可以根据
my_complex_方法返回的值
明智地使用枚举器:

(1..10).map { |a| [a, my_complex_method(a)] }.each do |a, success|
  puts a if success
end
您可以定义方法接受块,并在此块中根据成功或失败执行某些操作: (1..10)。每个都有| 我的|复杂|方法{|成功|下一个如果成功} 结束
多亏了作用域,您不能使用'catch`/'throw`,并且可以根据处理状态调用'next'。您真的,真的想得太多了。返回一个值并根据返回的值有条件地调用
next
。这是软件中非常常见的模式,几乎在我使用过的每种语言中都是如此<代码>抛出
/
捕获
在这里没有位置。我同意这个例子很荒谬,但我有一个例子,我需要分离循环和方法,因为我可以看出第一个方法不起作用-下一个
没有传递给每个啊,你是对的--
下一步
这里指的是在
我的复杂方法
中定义的收益率……我会选择这个答案,因为它让我意识到在我的真实代码中,
我的复杂方法
可以以不同的方式编写,所以这可以实现(以及Meagar对我的问题的评论)。。。但如果有人需要使用我在qestion中描述的功能,我会选择使用而不是我的
throw/catch
解决方案
1
3
5
(1..10).map { |a| [a, my_complex_method(a)] }.each do |a, success|
  puts a if success
end