为什么proc循环不遍历array(ruby)的每个元素?

时间:2018-08-06 18:31:50

标签: ruby

trio = Proc.new do |x|
  tf = true
  puts x
  if tf 
    puts "ai yo"
  end

end

trio.call([1, 2, 3, 4, 5])

输出:

  

1 2 3 4 5 ai yo#我相信它只会做一次ai yo部分   应该在每个数字之后做

但是我期望的输出是:

  

1 ai yo 2 ai yo 3 ai yo 4 ai yo 5 ai yo

我仍然不知道为什么会发生这种情况。

我试图使该程序正常工作,我认为这是使用proc的一种很酷的方法,尽管在这个特定问题中,我基本上不需要:

#The prime factors of 13195 are 5, 7, 13 and 29.
#What is the largest prime factor of the number 600851475143 ?

number = 13195

def factorsAndOptions(num, proc = Proc.new {|x|return x})
  factorsArray = []
  for i in 1..num
    factorsArray.push(i) if num % i == 0
  end
  proc.call(factorsArray)
end

largestPrime = Proc.new do |x|
  prime = true
  for j in 2...x
    if (x % x == 0)
      prime = false
   end
  end
  larger = x if prime && larger > x
  puts larger
  larger
end

factorsAndOptions(number, largestPrime)

2 个答案:

答案 0 :(得分:5)

call不会遍历参数。您写的实际上是:

puts [1, 2, 3, 4, 5]
puts "ai yo"

如果要迭代,请使用each

[1, 2, 3, 4, 5].each(&trio)

或者:

[1, 2, 3, 4, 5].each { |i| trio.call(i) }

答案 1 :(得分:0)

如上所述,您没有任何循环块。您的proc-trio作为一个元素作用在整个数组上。

在您的示例中:x变成[1, 2, 3, 4, 5],而不是您期望的数组单个元素。


要避免这种情况,您可以在Proc内部循环,也可以创建一个单独的Proc,该Proc将遍历数组的元素并调用第一个Proc。

示例1

trio = Proc.new do |arr|
  arr.each do |elem|
    puts elem
    if tf
      puts "ai yo"
    end
  end
end

这假设arr是一个数组

示例2

trio = Proc.new do |x|
  tf = true
  puts x
  if tf
    puts "ai yo"
  end

end


trio_helper = Proc.new do |x| 
 arr = x.to_a
 arr.each do |elem|
   trio.call(elem)
 end
end

trio_helper.call([1, 2, 3, 4, 5])

这将利用您编写的原始Proc,并使用另一个Proc遍历数组并在每个元素上调用第一个。