0

这是代码:

def count_ones(number, num_bits)
      (0...num_bits).inject(0) { |total, shift| total + (number >> shift & 1) }
end

puts (0...gets.to_i).map do 
    start, finish = gets.split.map(&:to_i)
    (start..finish).inject(0) { |total, number| total + count_ones(number, 32) }
end

如果我输入 3,我希望能够再输入 3 次。相反,它打印出一个可枚举的对象..

但是..如果我这样做,并输入 3 :

puts (0...gets.to_i).map { |i| i }

我得到了我期望的结果:0 1 2

我怎样才能调和这些矛盾的行为与一个和另一个?

4

1 回答 1

0

对于任何想知道的人,我想通了:它实际上是 do/end 的用法,而不是花括号。这段代码实际上评估并打印了我期望的块:

def count_ones(number, num_bits)
      (0...num_bits).inject(0) { |total, shift| total + (number >> shift & 1) }
end

puts (0...gets.to_i).map {
    start, finish = gets.split.map(&:to_i)
    (start..finish).inject(0) { |total, number| total + count_ones(number, 32) }
}

非常有趣,因为直到现在我都认为花括号和 do/end 在语义上是等价的。

于 2013-07-10T07:49:27.173 回答