运行我的代码时,我一直收到以下错误。
我的代码:
class Integer
def num_digits
Math.log10(self).to_i + 1
end
def p(t)
case t
when 3
return self * (self + 1) / 2
when 4
return self**2
when 5
return self * ((3 * self) - 1) / 2
when 6
return self * ((2 * self) - 1)
when 7
return self * ((5 * self) - 3) / 2
when 8
return self * ((3 * self) - 2)
end
end
end
$p3 = [], $p4 = [], $p5 = [], $p6 = [], $p7 = [], $p8 = []
$polygonals = [$p3, $p4, $p5, $p6, $p7, $p8]
(3..8).each_with_index do |t, index|
i = 1
until i == 150
$polygonals[index] << i.p(t)
i += 1
end
end
$polygonals.each { |array| array.reject! { |x| x.num_digits != 4 } }
错误:
`block (2 levels) in <main>': undefined method `num_digits' for []:Array (NoMethodError)
但是,如果我将最后一行代码更改为:
$polygonals.each { |array| array.each { |x| x.reject! { |y| y.num_digits != 4 } } }
我收到错误:
`block (2 levels) in <main>': undefined method `reject!' for 1:Fixnum (NoMethodError)
x
如何在第一种情况下输入array
,在第二种情况下输入Fixnum
?
答案 0 :(得分:1)
修改强> 失败的原因如下所示:
irb(main):072:0> $polygonals = [$p3, $p4, $p5, $p6, $p7, $p8]
=> [[[], [], [], [], [], []], [], [], [], [], []]
观察你的第一个元素是怎样的。不完全像你预期的那样,对吗?
实际上你有两个。看看$ polygonals [0]的样子:
IRB(主):066:0&GT; $ polygonals [0] =&GT; [[],[1,4,9,16,25,36,49,64, 81,100,121,144,169,196,225,256,289,324,361,400,441,484, 529,576,625,676,729,784,841,900,961,1024,1089,1156,1225, 1296,1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209, 2304,2401,2500,2601,2704,2809,2916,3025,3136,3249,3364, 3481,3600,3721,3844,3699,4096,4225,4356,4489,4624,4761, 4900,5041,5184,5329,5476,5625,5776,5929,6084,6241,6400, 6561,6724,6889,7056,7225,7396,7569,7744,7921,8100,8281,8464, 8649,8836,9025,9216,9409,9604,9801,10000,10201,10404,10609, 10816,11025,11236,11449,11664,11881,11200,12321,12544,12769, 12996,13225,13458,13689,13924,14161,14400,14641,14884,15129, 15376,15625,15876,16129,16384,16641,16900,17161,17424,17689, 17956,18225,18491,18776,19044,19321,19600,1881,1 20164,20449, 20736,21025,21316,21609,21904,22201],[1,5,12,22,35,51,70, 92,117,145,176,210,247,287,330,376,425,477,532,590,651, 715,782,852,925,1001,180,1162,1247,1335,1426,1520,1617, 1717,1820,1926,2035,2147,2262,2380,2501,2625,2752,2882, 3015,3151,3290,3432,3577,3725,3876,4030,4187,4347,4510,4676, 4845,5017,5192,5370,5551,5735,5922,6112,6305,6501,6700, 6902,7107,7315,7526,7740,7957,8177,8400,8626,8855,9087, 9322,9560,9801,10045,10292,10542,10795,11051,11310,11572, 11837,12105,12376,12650,12927,13207,13490,13776,14065,14357, 14652,14950,15251,15555,15862,16172,16485,16801,17120,17442, 17767,18095,1842,18760,19097,19437,19780,20126,20475,20827, 21182,21540,21901,22265,22632,23002,23375,23751,24130,24512, 24897,25285,25676,26070,26467,26867,27270,27676,28085,28497, 28912,29330,29751,30175,30602,31032,31465,31901,32340,32782, 33227],[1,6,15,28,45,66,91,120,153,190,231,276,325,378, 435,496,561,630,703,780,861,946,1035,1128,1225,1326,1431, 1540,1653,1770,1891,2016,2145,2278,2415,2556,2701,2850, 3003,3160,3321,3486,3655,3828,4005,4186,4371,4560,4753, 4950,5151,5356,5565,5778,5995,6216,6441,6670,6903,7140, 7381,7626,7875,8128,8385,8646,8911,9180,9453,9730,10011, 10296,10585,10878,11175,11476,11781,12090,12403,12720,13041, 13366,13695,14028,14365,14706,15051,15400,15753,16110,16471, 16836,17205,17578,17955,18336,18721,19110,19503,19900,20301, 20706,21151,21528,21945,22366,22791,23220,23655,24090,24531, 24976,25425,25878,26335,26796,27261,27730,28203,28680,29161, 29646,30135,30628,31125,3162,32131,32640,33153,33670,34191, 34716,35245,35778,36315,36856,37401,37950,38503,39060,39621, 40186,40755,41328,41905,42486,43071,43660,44253],[1,7,18, 34,55,81,112,148,189,235,286,342,403,469,540,616,697, 783,874,970,1071,1177,1288,1404,1525,1651,1782,1918,2059, 2205,2356,2512,2673,2839,3010,3186,3367,3553,7 3744,3940, 4141,4377,4558,4774,4995,5221,5452,5688,5929,6175,6426, 6682,6943,7209,7480,7756,8037,8323,8614,8910,9211,9517, 9828,10144,10465,10791,11122,11458,11799,12145,12496,12852, 13213,13579,13950,14326,14707,15093,15484,15880,16281,16687, 17098,17514,17935,18361,187922,19228,19669,20115,20566,21022, 21483,21949,22420,22896,23377,23863,24354,24850,25351,25857, 26368,26884,27405,27931,28462,28998,29539,30085,30636,31192, 31753,32319,32890,33466,34047,34633,35224,35820,36421,37027, 37638,38254,38875,39501,40132,40768,41409,42055,42706,43362, 44023,44689,45360,46036,46717,47403,48094,48790,49491,50197, 50908,51624,52345,53071,53802,54538,55279],[1,8,21,40,65, 96,133,176,225,280,341,408,481,560,645,736,833,936,1045, 1160,1281,1408,1541,1680,1825,1976,2133,2296,2465,2640, 2821,3008,3201,3400,3605,3816,4033,4256,4485,4720,4961, 5208,5461,5720,5985,6256,6533,6816,7105,7400,7701,8008,8321, 8640,8965,9296,9633,9976,10325,10680,11041,11408,11781, 12160,12545,12936,13333,13736,14145,14560,14981,15408,15841, 16280,16725,17176,17633,18096,18565,19040,19521,20008,20501, 21000,21505,22016,22533,23056,23585,24120,24661,25208,25761, 26320,26885,27456,28033,28616,29205,29800,30401,31008,31621, 32240,38665,33491,34133,34776,35425,36080,36741,37408,38081, 38760,39445,40136,40833,41536,42245,42960,43681,44408,45141, 45880,46625,47376,48133,488896,49665,50440,51221,52008,52801, 53600,54405,55216,56033,56856,57685,58520,59361,60208,61061, 61920,62785,63656,64533,65416,66305],1,3,6,10,15,21,28, 36,45,55,66,78,91,105,120,136,153,171,190,210,231,253, 276,300,325,351,378,406,435,465,496,528,561,595,630,666, 703,741,780,820,861,903,946,990,1035,1081,1128,1176,1225, 1275,1326,1378,1431,1485,1540,1596,1653,1711,1770,1830, 1891,1953,2016,2080,2145,2211,2278,2346,2415,2485,2556, 2628,2701,2775,2850,2926,3003,3081,3160,3240,3321,3403,3486, 3570,3655,3741,3828,3916,4005,4095,4186,4278,4371,4465, 4560,4656,4753,4851,4950,5050,5151,5253,5356,5460,5565, 5671,5778,5886,5995,6105,6216,6328,6441,6555,6670,6786, 6903,7021,7140,7260,7381,7503,7626,7750,7875,8001,1812,8256, 8385,8515,8646,8778,8911,9045,9180,9316,9453,9591,9730, 9870,10011,10153,10296,10440,10585,10731,10878,11026,11175]
这就是你的$ polygonals [1]的样子:
IRB(主):067:0&GT; $ polygonals [1] =&GT; [1,4,9,16,25,36,49,64,81, 100,121,144,169,196,225,256,289,324,361,400,441,484,529, 576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296, 1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209, 2304,2401,2500,2601,2704,2809,2916,3025,3136,3249,3364, 3481,3600,3721,3844,3699,4096,4225,4356,4489,4624,4761, 4900,5041,5184,5329,5476,5625,5776,5929,6084,6241,6400, 6561,6724,6889,7056,7225,7396,7569,7744,7921,8100,8281, 8464,8649,8836,9025,9216,9409,9604,9801,10000,10201,10404, 10609,10816,11025,11236,11449,11664,11881,11200,12321,12544, 12769,12996,13225,13458,13689,13924,14161,14400,14641,14884, 15129,15376,15625,15876,16129,16384,16641,16900,17161,17424, 17689,17956,18225,18491,1876,19044,19321,19600,19881,20164, 20449,20736,21025,21316,21609,21904,22201]
答案 1 :(得分:1)
这一行上的逗号
$p3 = [], $p4 = [], $p5 = [], $p6 = [], $p7 = [], $p8 = []
不要做你的想法。在红宝石
a = 1,2
将a
设置为[1,2]
,因此将$p3
设置为
[[], [], [], [], [], []]
如果您将这些分配放在单独的行上或使用;
而不是逗号,那么这些变量将初始化为您所期望的。
答案 2 :(得分:0)
首先,它通常被认为是扩展class Integer
def num_digits
Math.log10(self).to_i + 1
end
end
等核心类的不良做法。您应该只在特殊情况下执行此操作,在这种情况下,您提供应用程序可以在整个过程中使用的通用,有用的行为。
您编写的两种方法都是何时执行此操作的不良示例:
123.num_digits == 3
当你可以做一些像123.to_s.length == 3
这样的事情时,为什么还要使用这种数学技巧( def p(t)
case t
when 3
return self * (self + 1) / 2
# ...
when 8
return self * ((3 * self) - 2)
end
end
end
)?
p
这到底是什么?! 3..8
的含义是什么,为什么该方法仅适用于整数nil
(否则返回Integer
)?我猜它是计算多边形数字,在这种情况下你应该这样命名。这在def rename_me(x, y) # What are x and y? What IS this method? Use real words!
case y
when 3
x * (x + 1) / 2
# ...
when 8
x * ((3 * x) - 2)
end
end
类中没有位置;只是让它成为一个单独的方法,并更好地命名:
$
接下来,永远不要使用全局变量,除非你有充分的理由。在ruby中,以$polygonals
开头的变量名称是全局的。而不是polygonals
,只需定义x = 1, y = 2
等变量。
接下来,学习如何在ruby中定义变量。编写像x == [1, 2]
这样的代码并没有按照你的想法行事;这实际上是设置y == 2
和x, y = 1, 2
。这里的意图是定义变量的可能简写是:x == 1
设置y == 2
和def rename_me(x, y) # What are x and y? What IS this method? Use real words!
case y
when 3
x * (x + 1) / 2
# ...
when 8
x * ((3 * x) - 2)
end
end
polygonals = ([(1..149)] * 6)
.map.with_index do |range, index|
range
.map { |x| rename_me(x, index + 3) }
.select { |x| x.to_s.length == 4 }
end
- 但我不会像这样推荐1行定义;把它放在2行上。
考虑到所有这一切,以下是我将以更多&#34; ruby方式编写完整代码的方式&#34;:
x
然而(!!)你应该使用比我上面更好的变量名。不要只调用i
等东西,除非它们只是划痕变量;例如使用main = print (intercalate " something " (reverse (map reverse list)))
main = print (intercalate " something " ((reverse . map reverse) list))
main = print ((intercalate " something " . (reverse . map reverse)) list)
main = (print . (intercalate " something " . (reverse . map reverse))) list
作为索引有时也可以。