在循环中初始化变量

mik*_*h77 2 ruby iterator

我在一个each循环(或其他类型的循环)中将元素推入其中之前定义了一个包含空对象的变量,如下所示:

foo = []
collection.each do |item|
  foo << item
end
foo
Run Code Online (Sandbox Code Playgroud)

或者像这样:

foo = []
count = 0
collection.each do |item|
  count += 1
  raise ArgumentError if count > 10
  foo << item
end
foo
Run Code Online (Sandbox Code Playgroud)

但是,foo或者count经常出现并使代码混乱.有没有一种方法可以缩短这段代码?我想相信第一个foo可以放在循环中运行一次.

pan*_*ang 5

你可以使用注入方法:

foo = collection.inject([]) {|sum, item| sum << item }
Run Code Online (Sandbox Code Playgroud)

single-line block只是一个Ruby风格,喜欢{...}do...end单行块.无论是多行还是单行块,您也可以使用do...end,但对于多行块,do...end则更好.

foo = collection.inject([]) do |sum, item| 
          sum << item
       end # This is ok, but `{...}` looks better.
Run Code Online (Sandbox Code Playgroud)

多行:

foo = collection.inject([]) do |sum, item| 
          # line 1
          # line 2
          # and more
       end
Run Code Online (Sandbox Code Playgroud)

对于Ruby风格,您可以从The Ruby Style Guide获得更多信息