arrays – 为正负n创建从0到n的数字数组
给定n,我想创建一个从0到n的数组:
10.make_array #=> [0,1,2,3,4,5,6,7,8,9,10] 如果n为负数,它也应该有效: -10.make_array #=> [0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10] 我已经编写了这段代码,但我认为我使它变得比必要的更复杂(它对负数不起作用): class Fixnum define_method(:make_array) do my_array = [] self.times() do |count| self.>(0) my_array.push(count) end my_array.push(self) my_array end end 有没有更简单的方法或捷径做同样的事情,以及如何处理负数的任何建议? 解决方法
要支持负数,您可以使用
upto 和
downto 以及条件:
(我在这里展示了一个独立的方法,而不是修补整数) def make_array(n) if n > 0 0.upto(n).to_a else 0.downto(n).to_a end end 上面创建了一个使用 您可能希望通过直接调用 n = 3 Array.new(n) #=> [nil,nil,nil] 如果给出了一个块,它会将每个元素的索引传递给块,我们应该返回它的值.该索引实际上正是我们想要的,所以我们可以简单地返回它: Array.new(n) { |i| i } #=> [0,2] 如您所见,Array.new(n)返回n个元素,但我们需要n 1,所以让我们解决这个问题: Array.new(n + 1) { |i| i } #=> [0,3] 不幸的是,Array :: new不接受负面大小: Array.new(-3) #=> negative array size (ArgumentError) 所以对于负数n,我们必须传递-n并返回-i: n = -3 Array.new(-n + 1) { |i| -i } #=> [0,-3] 作为一种方法: def make_array(n) if n > 0 Array.new(n + 1) { |i| i } else Array.new(-n + 1) { |i| -i } end end 我们试着避免重复. 使用 3.abs #=> 3 -3.abs #=> 3 适用于我们的代码: n = 3 Array.new(n.abs + 1) { |i| i } #=> [0,3] n = -3 Array.new(n.abs + 1) { |i| i } #=> [0,3] 对于块,我们可以使用ternary n = 3 Array.new(n.abs + 1) { |i| n > 0 ? i : -i } #=> [0,3] n = -3 Array.new(n.abs + 1) { |i| n > 0 ? i : -i } #=> [0,-3] 我们甚至可以通过使用宇宙飞船操作符a< =>来删除该条件.湾它通过分别返回-1,0或1来确定a是否小于,等于或大于b. 更具体地,对于 3 <=> 0 #=> 1 -3 <=> 0 #=> -1 我们可以在块中使用< =>的结果来将i乘以: Array.new(n.abs + 1) { |i| i * (n <=> 0) } 这相当于i * 1(如果n> 0)或i * -1(如果n <0). (有第三个返回值:如果n等于0,则n< => 0返回0,但这无关紧要,因为在这种情况下,结果数组为[0],0 * 0仍然为0) 作为一种方法: def make_array(n) Array.new(n.abs + 1) { |i| i * (n <=> 0) } end 尽管它很短,但这种方法变得非常复杂,并且它的作用并不明显.因此,我更喜欢第一种方法(使用upto和downto的方法)因为它的简单性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- stm32学习之NOR flash和NAND flash区别,RAM 和ROM区别
- 关于MSP430-Flash超过64K的读写操作方法
- ruby – 加载类时的回调
- express接受ajax的发送post请求
- 如何强制Flex控件显示手型光标(hand cursor)
- 【Linux+Python】集群、ssh、python、import error
- c# – 禁用asp.net gridview中的文本换行
- 【Linux 移植 】——5、移植 u-boot-2012.04.01 之 支持Nor
- 正则表达式 – VBA正则表达式匹配时间范围,如“下午1:30 –
- 解决“System.Data.OracleClient需要Oracle客户端软件8.1.7