Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何引用数组中元素的索引#如果_Ruby_Methods - Fatal编程技术网

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