【发布时间】:2012-05-18 02:26:52
【问题描述】:
挑战是找到最小的整数foo:
foo % 1..20 == 0
我目前的尝试是蛮力
until foo % 1.upto(20) == 0 do
foo++
end
这会输出错误unexpected keyword end。但是,如果我不将 end 关键字放入 irb 代码将永远不会运行,因为该块没有关闭。
我做了一个空的测试用例来看看我的错误在哪里
until foo % 1.upto(20) == 0 do
end
这会引发一个新错误:enumerator can't be coerced to a fixnum。我想这意味着你不能直接在一个范围内执行模数并期望整个范围内有一个简洁的布尔结果。但我不知道从这里去哪里。
我的第一次尝试不是蛮力,而是尝试更有效/优雅/中肯的东西,如下所示:
foo = 1
1.upto(20) {|bar| foo *= bar unless foo % i == 0}
给出了错误的答案。我不明白为什么,但我也对为什么感兴趣
foo = 1
20.downto(1) {|bar| foo *= bar unless foo % i == 0}
输出不同的答案。
编辑:我会使用 for 循环(我在 ActionScript 中编程时弄湿了我的脚),但它们在 ruby 中无法正常工作。
【问题讨论】:
-
foo++ 在 Ruby 中无法正常工作。你需要写 foo += 1
-
@David:这是我最不喜欢的语言功能...
-
@sarnold 最不喜欢它是因为您希望它是用 Ruby 编写的,还是不喜欢用其他语言编写的?这在 Ruby(或一般的 OO)中并没有真正意义,因为数字不是可变的,
++因此会涉及隐藏分配。 -
@Andrew: 不要试图用 reasoning 来安抚我 :) -- 我刚刚习惯了
foo++在我使用的每一种语言中 -- 然后是 Ruby咬我。 -
@sarnold 不,我明白,我也习惯了,当我开始使用 Ruby 时感到震惊。但是看到
for循环在 Ruby 中不像在那些语言中那样存在,我不会太想念++。