Ruby 如何引用数组中元素的索引#如果
我想构建一个自定义方法Ruby 如何引用数组中元素的索引#如果,ruby,methods,Ruby,Methods,我想构建一个自定义方法数组#drop_every(n)(我知道这是monkey补丁,我这样做是为了做一个家庭作业),它返回一个新数组,忽略每n个元素: [4, 8, 15, 16, 23, 42].drop_every(2) # [4, 15, 23] 我想用数组#delete_if来实现它,但是通过引用索引而不是元素本身(类似于每个_索引)这样的方式: def drop_every(step) self.delete_if { |index| index % step == 0 } en
数组#drop_every(n)
(我知道这是monkey补丁,我这样做是为了做一个家庭作业),它返回一个新数组,忽略每n个元素:
[4, 8, 15, 16, 23, 42].drop_every(2) # [4, 15, 23]
我想用数组#delete_if
来实现它,但是通过引用索引而不是元素本身(类似于每个_索引
)这样的方式:
def drop_every(step)
self.delete_if { |index| index % step == 0 }
end
我该怎么做?我不坚持使用
delete\u if
,我还查看了drop\u while
和reject
,欢迎其他建议。您可以使用和\u index
方法返回枚举数,过滤集合,然后删除索引
class Array
def drop_every(step)
self.each.with_index.select { |_, index| index % step == 0 }.map(&:first)
end
end
[4, 8, 15, 16, 23, 42].drop_every(2) # => [4, 15, 23]
您可以使用
values\u at
方法有选择地筛选出所需的索引
class Array
def drop_every(step)
self.values_at(*(0...self.size).find_all{ |x| (x+1) % step != 0 })
end
end
我打字时,答案被接受了。无论如何我都会发布它。我会扩展mixin:
def drop_every step
delete_if.with_index(1){|_, i| i.%(step).zero?}
end
module Enumerable
def drop_every(step)
return to_enum(:drop_every, step) unless block_given?
each.with_index(1) do |o, i|
yield o unless i % step == 0
end
end
end
(1..10).drop_every(3) { |a| p a }
# outputs below
1
2
4
5
7
8
10
我喜欢你的解决方案简洁明了,但该方法返回的结果与我想要的完全相反-它返回每个第n个元素,我希望它忽略每个第n个元素。@AlexPopov因解决方案而更改,最终得到了您的意思…前一个在步骤中不起作用超过2请确保看到更新的答案,因为前一个在步骤>2中不起作用使用
self.size-1
否则,在某些情况下,最后一个元素将返回nil
。@tihom我使用了…
(半开区间)nice..不知道语法…我的不好
class Array
def drop_every(step)
self.each_slice(step).flat_map{|slice| slice[0..-2]}
end
end
p [4, 8, 15, 16, 23, 42].drop_every(2) #=> [4, 15, 23]
module Enumerable
def drop_every(step)
return to_enum(:drop_every, step) unless block_given?
each.with_index(1) do |o, i|
yield o unless i % step == 0
end
end
end
(1..10).drop_every(3) { |a| p a }
# outputs below
1
2
4
5
7
8
10