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)
答案 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遍历数组并在每个元素上调用第一个。