在没有迭代器的情况下,如何在Ruby中收集块值?

在没有迭代器的情况下,如何在Ruby中收集块值?,ruby,Ruby,下面是一些代码: i = 0 collection = [] loop do i += 1 break if complicated_predicate_of(i) collection << i end collection 但是,尽管出于某种原因这不是一个语法错误,loop.collect似乎什么也收集不到。(也不循环。减少)集合在语句末尾为零 换句话说,我想在没有显式迭代器的情况下收集循环语句的值。有什么方法可以做到这一点吗?你可以写 def complicate

下面是一些代码:

i = 0
collection = []
loop do
  i += 1
  break if complicated_predicate_of(i)
  collection << i
end
collection
但是,尽管出于某种原因这不是一个语法错误,
loop.collect
似乎什么也收集不到。(也不循环。减少)<代码>集合在语句末尾为零

换句话说,我想在没有显式迭代器的情况下收集
循环
语句的值。有什么方法可以做到这一点吗?

你可以写

def complicated_predicate_of(i)
  i > 3
end

1.step.with_object([]) { |i,collection| complicated_predicate_of(i) ?
  (break collection) : collection << i }
  #=> [1, 2, 3]  
collection = 1.step.take_while do |i| 
  i <= 3 # this block needs to return *false* to stop the taking
end
def(i)的复杂谓词
i>3
结束
1.步骤。与_对象([]){i,集合|复杂的_谓词_的(i)?
(中断收集):收集[1,2,3]
你可以写

def complicated_predicate_of(i)
  i > 3
end

1.step.with_object([]) { |i,collection| complicated_predicate_of(i) ?
  (break collection) : collection << i }
  #=> [1, 2, 3]  
collection = 1.step.take_while do |i| 
  i <= 3 # this block needs to return *false* to stop the taking
end
collection=1.step.take|u while do|i|

如果(i)
的复杂谓词不符合您的要求,则i是
break i。
break
可以使
循环
返回一个值,即
(one=loop{break 1})==1
你能添加一些完整的工作代码吗?我很好奇你为什么认为
循环。collect
应该是
语法错误
?它在
循环的返回值上调用
collect
。在另一个方法调用的返回值上调用方法在语法上是完全合法的。它被称为“方法链接”。好问题。请注意,
break x
将取消您的迭代,并始终返回
x
(或
nil
,如果未给出
x
)。使用通常返回集合的
collect
并不重要。它应该是
1。步骤
。否则回答得好!捕捉得好。已更正。
完美时进行拍摄!当屈服于块时,通常会忽略proc参数,因此
def numbers\u,直到
足够。请注意
block
为not在代码中引用。当你想
调用它时,可能在它被传递到另一个方法之后,一个proc被作为一个参数传递。这个方法所需要的就是
def numbers_until;1.step.take_while{i | yield(i)};end
。在过去几天里,我看到了很多不错的答案,没有任何升级投票。这只是一个印象吗?